Unity 基礎常用的腳本(一)

1.獲取相機射線

var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//GameObject.CreatePrimitive(PrimitiveType.Cube).transform.position = ray.GetPoint(10.0f);
transform.LookAt(ray.GetPoint(10.0f));

2.AddForce和velocity有什麼區別?

AddForce是施加一個力,這樣運動是靠力產生的加速度,然後就加速前進。
直接使用Velocity,速度很平穩,移動爲恆定值,相當於直接給設定了一個恆定的速度。

3.檢測哪個按鍵被按下

public void DetectPressedKeyOrButton()
{
    foreach (KeyCode kcode in Enum.GetValues(typeof(KeyCode)))
    {
        if (Input.GetKeyDown(kcode))
        {
            Debug.Log("KeyCode down: " + kcode);
        }
    }
}

4.在控制面板上查看腳本的私有變量
選中你的腳本文件,然後右鍵點擊Inspector,默認是Normal改成Debug
這裏寫圖片描述
5.鎖定檢視面板

當需要拖拽對象至檢視面板時,常常會因爲操作原因導致檢視面板的內容已經改變了。這時可以點擊檢視面板右上方的鎖圖標,鎖定檢視面板,這樣不論其它視圖如何切換,檢視面板都會顯示固定內容

6.若腳本出錯導致不能進入運行模式,不妨這樣試一試

如果腳本出現錯誤,Unity編輯器會因爲檢查到出錯而無法進入運行模式,這時可以在項目視圖中新建文件夾WebplayerTemplates,然後將出錯的腳本拖入此文件夾下,所有位於該文件夾下的文件都會被識別爲一般文件從而不會當作腳本被編譯,這樣就可以運行遊戲了。
我喜歡這個。也蠻有用的。

7.在固定的事件調用某個函數(這裏拿Abc函數爲例子)

using UnityEngine;  
using System.Collections;  

public class example : MonoBehaviour {  
    public Rigidbody projectile;  
    void Abc() {  
        Rigidbody instance = Instantiate(projectile);  
        instance.velocity = Random.insideUnitSphere * 5;  
    }  
    public void Awake() {  
        Invoke("Abc", 2);  
    }  
}  

8.每隔一定時間調用一次methodName函數

using UnityEngine;  
using System.Collections;  

public class example : MonoBehaviour {  
    public Rigidbody projectile;  
    void LaunchProjectile() {  
        Rigidbody instance = Instantiate(projectile);  
        instance.velocity = Random.insideUnitSphere * 5;  
    }  
    public void Awake() {  
        InvokeRepeating("LaunchProjectile", 2, 0.3F);  //2秒後,沒0.3f調用一次  
    }  
}  

9.單例模式的使用

using UnityEngine;
using System.Collections;

public class ModelLocator {

    public string myString;
    private static ModelLocator instance;
    public static ModelLocator getInstance{
        get{
            if(instance==null){
                instance=new ModelLocator();
            }
            return instance;
        }
    }
}

10.腳本的聲明週期

Awake:在遊戲運行時調用,用於初始化。
Start : 只在遊戲開始時執行一次,在Awake()函數後執行;
Update:在遊戲每一幀都執行一次,在Start()函數後執行;
LateUpdate:同Update,只是它會在Update()函數執行後再執行;
FixedUpdate:當遊戲中引入剛體系統,使用適配的方式同步物理時鐘,可以讓動力學更精確的計算;
OnGUI:繪製遊戲界面的函數,因爲每一幀執行多次,所以一些時間相關的函數要儘量避免直接在其內部使用。
OnMouseOver:鼠標停留在物體上時執行該函數的內容。
OnMouseEnter:鼠標進入物體範圍時執行該函數的內容。和OnMouseOver不同,該函數只執行一次。
OnMouseExit:鼠標離開物體範圍時執行該函數的內容。
OnMouseDown:鼠標按下時執行該函數的內容。
OnMouseUp:當鼠標釋放時執行該函數的內容。
OnMouseDrag:按住鼠標拖動時執行該函數的內容。

11.Random類(隨機數

float a=Random.value;  
int b=Random.Range(0,100)    包括最大和最小  
float c=Random.Range(0.0f,1.0f);   包括最小但不包括最大

12.Yield Return

//Yield語句是一種特殊類型的Return(返回)語句,它可以確保函數在下一次被執行時,不是從頭開始,而是從Yield語句處開始。  
//可以實現將一段程序延遲執行或者將其各個部分分佈在一個時間段內連續執行
void Start () {
    print("Start開始"); 
    StartCoroutine("Do"); 
    print("Do調用後"); 
}  
IEnumerator Do(){ 
    print("Do開始");  
    yield return  new WaitForSeconds(3.0f);  
    print("暫停3秒後"); 
}   

運行結果爲:Start開始–》Do開始—》Do調用後—》暫停3秒後

13.旋轉和移動

transform.Rotate(new Vector3(x,y,z)); 
transform.Translate(new Vector3(x,y,z));

14.判斷兩個物體之間的距離

Vector3.Distance( position1,position2);
//position1 和position2是需要判斷的兩個物體transform的position,distance是距離

15.Vector3的使用

//vector3.Project求某個向量在某個方向的投影向量(向量,方向)
float speed = Vector3.Project(agent.desiredVelocity, transform.forward).magnitude;
//Vector3.Angle求兩個向量的夾角
float angularSpeed = Vector3.Angle(agent.desiredVelocity, transform.forward);
//角度*mathf.deg2rad 角度轉爲弧度
//弧度*mathf.rad2deg 弧度轉爲角度
angular *= Mathf.Deg2Rad
//Vector3.Cross 求兩個向量的法向量
Vector3 normal = Vector3.Cross(transform.forward, agent.desiredVelocity);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章