02 面向組件開發

應用程序
新建立的Unity工程,其目錄文件夾中包含4個文件夾
Assets:資源
Library:庫文件
ProjectSetting:工程設置文件
Temp:臨時文件數組

工程,場景,遊戲對象和組件的關係:
在Unity開發中:一個工程裏面有多個場景,一個場景裏面有多個遊戲對象,每個遊戲對象又有多個組件編輯器

Unity組件開發思想
Unity引擎是面向組件開發的,想要遊戲對象實現什麼樣的功能就添加什麼樣的組件ide

Transform組件
任何一個遊戲對象在場景中都會有位置,旋轉,和縮放的基本信息,因此該組件是必須存在的.
transform:當前腳本所掛載的遊戲物體的transform
transform能夠直接指代當前腳本所掛載的遊戲物體
tranform組件 維持父子關係函數

腳本組件
腳本在建立時候類名必須與腳本名一致,並自動的繼承MonoBehaviour類,插件

Unity腳本組件
Unity腳本類(兩大分類):
(Runtime Classes) 實時運行類:遊戲運行時執行的類
(Editor Classes) 編輯器類:主要用來實現插件orm

MonoBehaviour類:
1.Unity腳本組件必須繼承MonoBehaviour類
2.繼承自MonoBehaviour的腳本組件能夠自動調用其封裝好了的毀掉方法.對象

Unity腳本生命週期
Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroyblog

//表示當前腳本被喚醒時被調用
void Awake (){
Debug.Log ("Awake");
}
//表示當前腳本可用時被調用
void OnEnable (){
Debug.Log ("OnEnable");
}
//在update函數第一次執行前被調用
void Start (){
Debug.Log ("Start");
Destroy (gameObject, 3);
}
//遊戲運行期間每幀執行一次
void Update (){
Debug.Log ("Update");
//Time.deltaTime 表示當前執行一幀所消耗的時間
}
//固定幀回調函數,固定的時間調用
//通常先於Update
void FixedUpdate (){
Debug.Log ("FixedUpdate");
}
//每次Update執行完會執行該函數
void LateUpdate (){
//永遠在Update以後執行
Debug.Log ("LateUpdate");
}
//處理GUI渲染和GUI事件時
void OnGUI (){
Debug.Log ("OnGUI");
}
//當腳本不可用時調用
void OnDisable (){
Debug.Log ("OnDisable");
}
//當腳本被銷燬時調用
void OnDestroy (){
Debug.Log ("OnDestroy");
}繼承

Unity腳本組件經常使用的類生命週期

       GameObject類:

     得到遊戲物體的tag值:GameObject.tag
    得到遊戲物體的名字;GameObject.name
根據對象名找到對應的遊戲對象
GameObject.Find ("Sphere");
根據遊戲對象的Tag值找到對應的遊戲對象
GameObject.FindGameObjectWithTag ("Player");
經過此方法找到的一類擁有同一標籤的多個遊戲物體,所返回的數組中數組的排列順序是與遊戲物體的建立順序恰好相反的.
經過Cube上的組件來改變Cube的顏色:GetComponent<MeshRenderer> ().material.color = Color.red;
默認的是該腳本掛載的對象,若是是要改變當前腳本所掛載的遊戲對象,可省略gameObject:playerObj.GetComponent<MeshRenderer> ().material.color = Color.green;
設置遊戲對象爲不可用:enemyObj.SetActive (false);
在3秒後刪除遊戲對象:Destroy (enemyObj, 3f);

Transform類:

   世界座標位置:Debug.Log ("position = " + transform.position);
   相對於父物體之間的距離:Debug.Log ("Localpotion = " + transform.localPosition);
   物體的旋轉:Debug.Log ("roation = " + transform.rotation);
  相對於世界原點的歐拉角:Debug.Log ("eulerAngle = " + transform.eulerAngles);
  相對於父物體的歐拉角:Debug.Log ("localeulerAngle = " + transform.localEulerAngles);
  縮放:Debug.Log ("scale = " + transform.localScale);
  找到遊戲物體的父類:Debug.Log (transform.parent);
  //朝向的遊戲物體
public Transform target;
void Update (){
transform.LookAt (target);
//在這是腳本所掛載的遊戲物體朝向target,target被遊戲物體朝向
Translate:讓物體朝着某個方向移動
transform.Translate (new Vector3 (0.01f, 0, 0));
若是relativeTo留空或者設置爲Space.Self,移動被應用相對於變換的自身軸。(當在場景視圖選擇物體時,x、y和z軸顯示)若是相對於Space.World 移動被應用相對於世界座標系統。
另一種移動方式
transform.position += new Vector3 (0.01f, 0, 0);
物體繞某個軸旋轉
transform.Rotate (new Vector3 (0, 10, 0));
繞軸旋轉
transform.Rotate (new Vector3 (5, 0, 0), 10);
繞某個點旋轉,第二個參數旋轉的軸,第一個參數是繞的點,第三個參數旋轉的角度
transform.RotateAround (new Vector3 (0, 0, 0), new Vector3 (0, 1, 0), speed);
transform.forward, transform.right, transform.up

Vector3(三維向量)
Vector3是封裝了向量相關變量和方法的結構體
Debug.Log ("位置V3向量:" + transform.position);
normalized(屬性):表示標準化向量,方向不變,大小爲1
Debug.Log ("標準化V3向量:" + transform.position.normalized);
magnitude:V3向量的長度
Debug.Log ("V3向量的長度" + transform.position.magnitude);
sqrMagnitude:V3向量的長度的平方
Debug.Log ("V3向量的長度的平方"+transform.position.sqrMagnitude);

Debug.Log (Vector3.up);//(0,1,0)
Debug.Log (Vector3.down);//(0,-1,0)
Debug.Log (Vector3.right);//(1,0,0)
Debug.Log (Vector3.left);//(-1,0,0)
Debug.Log (Vector3.forward);//(0,0,1)
Debug.Log (Vector3.back);//(0,0,-1)

控制物體移動
transform.Translate (Vector3.left * Time.deltaTime);

Vector3 vec = new Vector3 (6, 8, 10);
Debug.Log ("標準化以前:" + vec);
Normalize和normalized都能獲得一個標準化向量,方向和調用者一致,大小都爲1,
但使用Normalize會直接更改調用者自己,而使用normalized不會更改調用者
vec.Normalize ();
Debug.Log ("標準化以後:" + vec);

//求小球和Cube之間的距離
(第一個參數是起始位置,第二個是結束位置)
float dis = Vector3.Distance (transform.position, cubeTransform.position);

判斷小球和Cube之間的距離小於0.1
確認小球到達Cube了
if (dis >= 0.1f) {
//在Lerp中用到了插值,插值有一個插值係數(<1),第一次移動兩物體之間距離*插值係數,第二次移動剩下的的距離*插值係數,只會無限接近於另外一個物體,永遠不會中止

方法內第一個參數是要移動物體的位置,第二個是移動的目標物體,第三個參數是插值係數
transform.position = Vector3.Lerp (transform.position, cubeTransform.position, 0.02f);
}
得到Cube朝向小球的旋轉角度
float angle = Vector3.Angle (cubeTransform.forward, (transform.position - cubeTransform.position));
Debug.Log ("Cube朝向小球的旋轉角度:" + angle);

Vector3.Angle(角度):
由from和to兩個向量返回一個不大於180°的夾角


Time類:
從遊戲開始到如今全部的時間
Debug.Log ("time = " + Time.time);

當前一幀所執行的時間
獲取上一次Update()執行的時間到本次Update執行的時間
注;deltaTime的值每一次都是不同的,是一個不穩定的值
Debug.Log ("deltaTime: " + Time.deltaTime);

固定幀數下,每一幀的執行時間
Debug.Log ("fixedDeltaTime: " + Time.fixedDeltaTime);

表示時間縮放,正的時間縮放爲1,若是調成1.5播放速度變快,調成0,時間就會靜止
能夠作遊戲暫停
Debug.Log (Time.timeScale);

Quaternion類:
identity:表示四元數無旋轉,經常使用在建立對象
LookRotation:返回的是一個從自身位置指向向目標位置的向量
//獲取到Cube的正前方的視角看向目標點target時要旋轉的角度四元數
rote = Quaternion.LookRotation (targetTransform.position - transform.position);
//將要旋轉的四元數賦值給Cube,,實現Cube朝向目標點
transform.rotation = Quaternion.Lerp (transform.rotation, rote, Time.deltaTime);

Mathf類:
Lerp:兩個浮點數之間進行插值
float temp = Mathf.Lerp (1f, 10f, 0.5f);
//至關於:(10+1)*0.5
Debug.Log ("temp = " + temp);
Clamp:返回一個限制值
//Mathf.Clamp:表示返回最大值和最小值之間的數,
//若是返回的數值小於最小值,那麼返回最小值
//若是返回的數值大於最大值,那麼返回最大值
//Debug.Log (Mathf.Clamp (Time.time, 1.0f, 3.0f));
Sqr:返回平方根
PI:圓周率 π:3.1415926...

預設體:預設體是某一遊戲對象的集合,使用預設體可以使遊戲對象或資源重複利用使用預設體後可使用腳本控制產生或銷燬遊戲對象,而不是機械的手動在層級視圖上建立.在代碼中使用Instantiate來實如今場景建立遊戲物體至關因而一個實例化的過程.

相關文章
相關標籤/搜索