unity3d 2018.3f5 乾貨教程基礎命令方法

安裝及配置貼

http://blog.csdn.net/lengyoumo/article/details/78723142

####本帖腳本文件使用c#語言

###在腳本中獲取當前腳本綁定的對象

transform爲當前綁定的對象
例:
transform.Translate(positionX, positionY, positionZ);

###在腳本中獲取目標對象

GameObject是獲取對象的方法。GetComponent用來獲取屬性是泛型,指定屬性的名稱。

例1:
GameObject.Find(“ts”).GetComponent().text=“哈哈”;
例2:
Transform n= Instantiate(newObject,position,routation)
n.GetComponent().AddForce(fwd*2800);

###腳本控制gui文字

首先必須引入頭文件
using UnityEngine.UI;

例:

GameObject.Find(“objectname”).GetComponent().text=“哈哈”;

###編寫輸入控制簡本
按鍵

檢測如果按下了按鍵"Q"就觸發事件
if(Input.GetKey(KeyCode.Q)){
transform.Rotate(0,1,0);
}

鼠標左鍵按鍵

if(Input.GetButtonDown(“Fire1”)){
transform.Rotate(0,1,0);
}
if(Input.GetMouseButtonDown(0)){
}

根據asdf 上下左右觸發事件

// 獲取{-1,1}的範圍判定按鍵方向 asdw 上下左右,數值會隨按壓時間增長{-1,1}
//獲取垂直 水平數據
float h = Input.GetAxis(“Horizontal”);
float v = Input.GetAxis(“Vertical”);
// 爲物體加力
rd.GetComponent().AddForce(new Vector3(h,0,v)*moveSpeed);

###對象生成器

創建新對象
public Transform newObject;
在當前腳本綁定的對象的位置和角度創建一個新的對象n
Transform n= Instantiate(newObject,transform.position,transform.rotation);
新建的物體賦予新的屬性
Vector3 fwd =transform.TransformDirection(Vector3.forward);
n.GetComponent().AddForce(fwd*2800);
###對象銷燬

3秒後刪除當前對象
void Start () {
Destroy(gameObject,3);
}

###測試方法

Debug.Log(object)

###Gameobject ,gameObject,Transform,transform的區別和關聯

Gameobject是一個類型,所有的遊戲物件都是這個類型的對象。通過這個對象可以控制其他物體和屬性。
gameobject是一個對象, 就跟java裏面的this一樣, 指的是這個腳本所附着的物體。
-
Transform是一個類,用來描述物體的位置,大小,旋轉等等信息。
transform是Transform類的對象,依附於每一個物體。也是當前腳本綁定的組件
-
transform : 當前遊戲對象的transform組件
gameobject :當前遊戲對象的實例
-
gameobject.find用來獲取場景中我們需要查找的對象(object)。而transform.find方法則是獲取當前對象的子對象下我們需要獲取的目標對象位置信息

gameobject.transform與transform.gameobject
gameobject.transform,是獲取當前遊戲對象的transform組件.
所以在start函數中 gameobject.transform 和this.transform,指向的都是同一個對象。即:gameobject.transform == this.transform == transform
* transform.gameobject:可以這麼理解爲:獲取當前transform組件所在的gameobect
所以在start函數中()transform.gameobject == this.gameobject == gameobect
該部分轉自網友的帖子
http://blog.csdn.net/lxl_815520/article/details/53638481

###菜單控制命令

退出
Application.Quit();
重新讀取場景01
using sceneManager=UnityEngine.SceneManagement;
sceneManager.SceneManager.LoadScene(“01”);

###碰撞檢測
碰撞檢測的特點是一旦觸發碰撞主角與被碰撞物體都會受到物理影響
碰撞檢測有三個會自動觸發的過程方法

OnCollisionEnter(Collision collision)//開始碰撞
OnCollisionExit()//結束碰撞
//碰撞持續中

碰撞檢測 是物理引擎Rigidbody中的api
在主角腳本中 加入 碰撞自動觸發方法
void OnCollisionEnter(Collision collision){
// collision.collider 獲取碰撞到的遊戲物體身上的Colliser組件
// string name =collision.collider.name;//獲取碰撞到的物體名字
如果碰撞的 標籤符合條件則刪除
if(collision.collider.tag==“food 1” ){
Destroy(collision.collider.gameObject);
}
}

###觸發檢測
觸發檢測與碰撞檢測的區別是,由於碰撞雙方其中一方取消了碰撞區域,所以碰撞後雙方都沒有受物理影響。

觸發檢測也有三個自觸發方法
OnTriggerEnter(Collider collider)//開始觸發
OnTriggerExit()//結束觸發

1,首先選定受力物體 屬性 中的 "is trigger"選項。使其不受物理影響
2,void OnTriggerEnter(Collider collider){
if(collider.tag==“food” ){
Destroy(collider.gameObject);
}
}

###射線檢測
射線檢測是從指定位置發射光線,光線觸碰的第一個物體或是穿過的所有問題會產生反饋

###鼠標光標設置
設置 Cursor.lockState 可以設置鼠標光標限制

//無任何限制
 Cursor.lockState=CursorLockMode.None;
//將光標鎖定在屏幕中央
Cursor.lockState = CursorLockMode.Locked;
//將光標限制在遊戲窗口內
Cursor.lockState = CursorLockMode.Locked;

是否顯示光標
Cursor.lockState = true;
官方鼠標api
https://docs.unity3d.com/ScriptReference/30_search.html?q=cursor

###GUI 按鈕方法
五種添加按鈕的方法
0,

1,在畫布中創建ui butoon
2,創建腳本 mybutton   並將其拖到ui button上
腳本內容:
void Start () {
	gameObject.GetComponent<Button>().onClick.AddListener(OnClick);
	}
void OnClick(){
	Debut.Log("u click button")
}

1,直接添加按鈕

1在畫布中直接創建UI Button
2創建一個腳本 mybutton
添加一個公有屬性和 一個公有的自定義方法
using UnityEngine.UI;
public Button btn;
public void ButtonAct(){
Debut.Log(“hahaha?”);
}
3,將該腳本綁定到畫布裏
4,將之前創建的按鈕控件拖拽到 canvas畫布裏的 btn屬性。就是將按鈕綁定到畫布。
5,把畫布綁定到按鈕裏。點擊button控件,在下面的onclick屬性 中 選擇腳本掛載的物體。就是canvas。然後 選擇剛纔新建的方法 ButtonAct()

2,腳本生成按鈕

在腳本中添加一個方法 void OnGUI(){
rect中的參數爲橫座標縱座標長和寬
if(GUI.Button(new Rect(80,80,100,60),“按鈕1”)){
print(“點擊了該按鈕”);
}
}

3.腳本帶貼圖的按鈕

1在腳本中添加一個方法 void OnGUI(){
rect中的參數爲橫座標縱座標長和寬
if(GUI.Button(new Rect(80,80,100,60),texture)){
print(“點擊了有圖標的按鈕”);
}
}
2.mybutton腳本中有了textrue屬性,然後把貼圖拖過去即可。

3.腳本帶style的按鈕(高自定義)

1 添加公共屬性 GUIStyle.style;
2在腳本中添加一個方法 void OnGUI(){
rect中的參數爲橫座標縱座標長和寬
if(GUI.Button(new Rect(80,80,100,60),“按鈕x”,style)){
print(“點擊了有style的按鈕”);
}
}
3.mybutton腳本中有了tstyle系列的屬性,按需設置即可。

按鈕綁定

https://www.cnblogs.com/isayes/p/6370168.html

###GUI label 控件
也是三種方式

void OnGUI(){
{
1,
GUI.Label(new Rect(100,100,80,60),“這是一個文字標籤”);
2,
using unityEngine.UI
public Texture texture;
GUI.Label(new Rect(100,100,80,60),texture);
3,
public GUIContent content
GUI.Label(new Rect(100,100,80,60),content);
}
###GUI textField控件
兩種方法
1直接用控件
直接在project中create InputFeld

2代碼創建

public string str="請輸入文本"; void OnGUI(){ str=GUI.TextField(new Rect(100,400,200,100),str) }
###Image,RawImag控件
兩個組件的區別,Image是精靈圖片。RawImag可以添加紋理圖片。

###ui 佈局

2,給空物體添加組件layout中的一種佈局方式
3,在空物體下新建物體,重複的添加之後就會自動對齊

###UI自適應窗口尺寸

Canvas 的 Inspector 中設置 Canvas Scaler (Script) 的 UI Scale Mode 爲 Scale With Screen Size。
填寫 Reference Resolution 的 XY 爲你想要的屏幕尺寸。
Canvas 的 Inspector 中設置 Render Mode 爲 Screen Space - Camera,Render Camera 爲 Main Camera(場景主相機)

##使用ui事件

這時點擊 eventSystem 再點擊運行遊戲,就能在右面的屬性面板看到當前鼠標與ui交互的信息了
2,寫一個腳本 在腳本中 的類下 繼承IPointerDownHandller接口 (然後按提示添加using)
添加 public void OnPointerDown(){
	print("你按了按鈕")
}
3,把腳本綁定到按鈕上。

###使物體移動的兩種方法
1.直接修改物體座標

//walkSpeed= +-number
//前後移動
transform.Translate(Vector3.forward  * Time.deltaTime* walkSpeed);  
transform.Translate(Vector3.forward * Time.deltaTime * -walkSpeed ); 
//左右移動
transform.Translate(Vector3.left * Time.deltaTime * walkSpeed );  
transform.Translate(Vector3.left * Time.deltaTime * -walkSpeed );  

2通過剛體屬性施加作用力

//walkSpeed= +-number
//前後重力移動
gameObject.GetComponent<Rigidbody>().AddForce(transform.forward*walkSpeed);
//gameObject.GetComponent<Rigidbody>().AddForce(transform.forward*-walkSpeed);	
//左右重力移動
//gameObject.GetComponent<Rigidbody>().AddForce(transform.right*-walkSpeed);
//gameObject.GetComponent<Rigidbody>().AddForce(transform.right*walkSpeed);

###在腳本中獲取物體的方法
1,獲取腳本綁定的物體

1 將腳本拖拽到物體上 即完成腳本與物體綁定。
2,在腳本中 直接調用gameObject就是當前綁定的物體
直接調用transform 是當前綁定物體的位置方向大小等信息。

2,獲取指定名稱的物體

在任意腳本中 調用GameObject.Find("物體名")即可獲取該物體
調用GameObject.Find("物體名").GetComponent<屬性名>();即可獲取該物體的屬性;

3,獲取 物體綁定的屬性中指定的物體

1,首先創建腳本 並與某個物體綁定。
2,在腳本中創建公共屬性 pulic GameObject gameobj;
3,此時腳本綁定物體的屬性欄中出現了gameobj屬性,將另一個要綁定的物體拖過來即可
在腳本中直接調用gameobj即可.

###prefab預置體
######動態加載prefab

1,prefab必須放置在 assets-Resources->prefabs中。 注意這個Resources
2,實例化
GameObject targetObject = (GameObject)Resources.Load("Prefabs/Switch");
3,實體化,newObj就是實體化後的對象。
	GameObject newObj=Instantiate(targetObject);
4,指定對象的位置
newObj.transform.parent =GameObject.Find("Canvas").transform;	

#####批量修改prefab物體
修改一個prefab生成的物體,然後再屬性中選擇apply 即可同步到所有的物體。

###一個元素工廠 產生器
自動複製生成指定的物體。

1,創建一個物體,作爲產生器。
2,編寫一個腳本並綁定到產生器。
//要複製的源物體
public GameObject generateGameObjReource;
void Update () {
	//創建新物體,參數是物體源,位置,方向。
	  GameObject newGameObj=Instantiate(generateGameObjReource,new Vector3(1,1,1),new Quaternion(0,0,0,0));
}
3,將要生成的物體綁定到產生器的腳本屬性 enerateGameObjResource

###創建對象

//創建3d對象類型
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
//添加剛體屬性                cube.AddComponent<Rigidbody>();
//設置位置                    
cube.transform.position = new Vector3(x, y, 0);

調整大小
````newGameObj.transform.localScale=new Vector3(20f,15f,1);```

###動畫 animation animator
點擊物體->window->animation -create cure 即可創建一個動畫。爲物體創建動畫會自動申城一個animation controller ,就是animator。
animation是動畫主體,animator是控制動畫播放,順序的。
###按條件控制動畫播放
1在animator窗口左上角 點擊parameter,即可創建變量,這裏選int類型。
2然後再右面entry下面 新建一個state 使entry連接state,state再連接動畫state。在該state中inspector 點擊conditions 即可選擇新建的變量。此處可以設置等於大於或小於4中條件判斷。
3最後 哎playmaker或腳本中 設置該變量等於指定的數值 ,即可開啓該state 跳至動畫播放。

unity Navigation 自動尋路

1,創建地形plan,障礙物,主角。
2,點擊地形->window->Navigation,勾選Navigation static。然後點擊bake 即可出地形。
3,爲主角添加 Navigation組件
4,爲主角添加腳本
private NavMeshAgent navAgent;
	// Use this for initialization
	void Start () {		navAgent=gameObject.GetComponent<NavMeshAgent>();
	}	
	// Update is called once per frame
	void Update () {
		navAgent.SetDestination(new Vector3(0,0,20));
	}

即可成功觸發。尋路





###故障&問題
please set the bundle identifier in

android平臺導出問題。在buildsetting 中選player setting,然後再 othersetting 中修改公司的名字即可
com.componyname.objname

#2d遊戲
###初始設置
1,攝像機設置成正交相機。
2,在屏幕中position z軸決定元素前後順序

###建立sprite動畫
1,在桌面創建精靈。新創建的精靈可能會過小需要放大。
2,window->animation 打開動作編輯器
3,點擊剛纔添加的精靈,這時animation編輯器中 create就可以按了
4,點擊create 創建動畫文件
5,點擊左面的add property按鈕->sprite render -> 後面的加號。 這樣就新建了一條時間線。
6,將圖片或圖片組 拖拽到時間線即可。
點擊時間線的下箭頭可在時間線預覽圖片
7,直接關閉即可保存
創建精靈時最好直接做成prefab ,如果沒有,做好動畫後直接拖拽到精靈元素上也行。

###時間 Time

1/ Time.time 表示從遊戲開發到現在的時間,會隨着遊戲的暫停而停止計算。

2/ Time.timeSinceLevelLoad 表示從當前Scene開始到目前爲止的時間,也會隨着暫停操作而停止。

3/ Time.deltaTime 表示從上一幀到當前幀時間,以秒爲單位。

//計時器通過這個使用,update裏把Time.deltaTime累加起來,就是經過的時間
4/ Time.fixedTime表示以秒計遊戲開始的時間,固定時間以定期間隔更新(相當於fixedDeltaTime)直到達到time屬性。

5/ Time.fixedDeltaTime 表示以秒計間隔,在物理和其他固定幀率進行更新,在Edit->ProjectSettings->Time的Fixed Timestep可以自行設置。

6/ Time.SmoothDeltaTime 表示一個平穩的deltaTime,根據前 
N幀的時間加權平均的值。

7/ Time.timeScale 時間縮放,默認值爲1,若設置<1,表示時間減慢,若設置>1,表示時間加快,可以用來加速和減速遊戲,非常有用。

8/ Time.frameCount 總幀數

9/ Time.realtimeSinceStartup 表示自遊戲開始後的總時間,即使暫停也會不斷的增加。

10/ Time.captureFramerate 表示設置每秒的幀率,然後不考慮真實時間。

11/ Time.unscaledDeltaTime 不考慮timescale時候與deltaTime相同,若timescale被設置,則無效。

12/ Time.unscaledTime 不考慮timescale時候與time相同,若timescale被設置,則無效。
From: http://blog.csdn.net/liuyang_sy/article/details/46811125 

###調試&測試
#####android真機測試配置

1,打開手機端開發者選項,打開usb調試,並將手機連接到電腦

2,在player setting 中 的other stting 中勾選 enable internal profiler

3,building setting中勾選 development build和auto connect profiler

4,運行 build and run
手機端就會彈出安裝信息。

###手機屏幕翻轉
#####禁止手機屏幕翻轉

1.通過設置
Plyer Setting 中設置 Deafult Orientation 爲 portrait。
2.通過代碼(代碼決定權更高)
Screen.orientation = ScreenOrientation.AutoRotation;  
        /// 是否可以翻轉到某個方向
        Screen.autorotateToLandscapeLeft = true;  
        Screen.autorotateToLandscapeRight = true;  
        Screen.autorotateToPortrait = true;  
        Screen.autorotateToPortraitUpsideDown = true;  

#####限定手機翻轉方向

void Start()  
{  
	//設置屏幕正方向在Home鍵右邊  
    //Screen.orientation = ScreenOrientation.LandscapeRight; 
    //設置屏幕自動旋轉, 並置支持的方向  
    Screen.orientation = ScreenOrientation.AutoRotation;  
    Screen.autorotateToLandscapeLeft = true;  
    Screen.autorotateToLandscapeRight = false;  
    Screen.autorotateToPortrait = false;  
    Screen.autorotateToPortraitUpsideDown = false;  
}  

###生命週期
(借用一張圖,原文地址在水印上:)
這裏寫圖片描述

需要特別說明的是OnEnable  是每次暫停後,重新開始也會執行一次的生命狀態。

腳本無法跟隨物體獨立的問題

就是說同一個腳本,放置在不同的物體上,他們共享了數據,並沒有獨立創建。這個時候你要將物體變爲profab纔可以完全獨立。   我在美科科技遇到的問題。

還是上一個問題

公共類的初始化,一定要用awake。  start有可能會太晚創建。

###鼠標拖拽事件

//需要在被拖拽的物體上添加的腳本
 using UnityEngine.EventSystems;
using UnityEngine;
public class ModuleDrag : MonoBehaviour, IDragHandler, IInitializePotentialDragHandler, IEndDragHandler, IDropHandler {
	void Start () {
	}
	void Update () {
	}
	public void OnInitializePotentialDrag(PointerEventData eventData)
    { 
    //當鼠標在A對象按下還沒開始拖拽時 A對象響應此事件
        //注:此接口事件與IPointerDownHandler接口事件類似
        //    有興趣的朋友可以測試下二者的執行順序這裏不再贅述
        Debug.Log("OnInitializePotentialDrag " + name);
    }
	public void OnDrag(PointerEventData eventData)
    {
        //當鼠標在A對象按下並拖拽時 A對象每幀響應一次此事件
        //注:如果不實現此接口,則後面的四個接口方法都不會觸發
        Debug.Log("OnDrag " + name);
    }
public void OnEndDrag(PointerEventData eventData)
    {
        //當鼠標擡起時 A對象響應此事件
        Debug.Log("OnEndDrag " + name);
    }
	public void OnDrop(PointerEventData eventData)
    {
        //A、B對象必須均實現IDropHandler接口,且A至少實現IDragHandler接口
        //當鼠標從A對象上開始拖拽,在B對象上擡起時 B對象響應此事件
        //此時name獲取到的是B對象的name屬性
        //eventData.pointerDrag表示發起拖拽的對象(GameObject)
       Debug.Log(eventData.pointerDrag.name + " OnDrop to " + name);
    }
}
//需要在釋放物體上放置的事件
public class ModuleDrop : MonoBehaviour, IDropHandler{
	// Use this for initialization
	void Start () {
	}// Update is called once per frame
	void Update () {
		
	}
	public void OnDrop(PointerEventData eventData)
    {
        //A、B對象必須均實現IDropHandler接口,且A至少實現IDragHandler接口
        //當鼠標從A對象上開始拖拽,在B對象上擡起時 B對象響應此事件
        //此時name獲取到的是B對象的name屬性
        //eventData.pointerDrag表示發起拖拽的對象(GameObject)
        Debug.Log(eventData.pointerDrag.name + " OnDrop to " + name);
    }
}

###ui
####如何讓ui 跟隨在相機中固定位置

設置rect transform 中的。anchor presets,按住alt即可選擇預製位置,當然也可以通過腳本設置。

####如何讓ui 不跟隨相機,像普通2d物體一樣固定在遊戲世界

設置 Canvas 屬性中的 Reader Modde 設置爲World Space
此時 cavas只渲染鏡頭中出現的元素。也算是優化方法之一。

###關於旋轉座標 rotation.
https://blog.csdn.net/ronintao/article/details/52236210

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章