第二章 Unity腳本

Unity 3D腳本

1 創建腳本

1.1 C#腳本

Project視圖 右鍵 > Create > C# Script

using UnityEngine;
public class CSharp : MonoBehaviour{
    
    void Start(){

    }

    void Update(){

    }

}

1.2 JavaScript腳本

Project視圖 右鍵 > Create > Javascript

function Start(){

}

function Update(){

}

以后腳本都以C#為例

1.3 設置腳本自定義圖標

選中腳本 -> 點擊

2 MonoBehaviour

所有繼承MonoBehaviour的類從腳本喚醒到銷毀有著完整的生命周期

Awake() 喚醒方法

當游戲對象被創建時調用,無論腳本是否激活都會調用。

Start() 開始方法

腳本第一次激活的時候立即執行(位于Awake()之后執行),只會執行一次(即使重新激活腳本,也不會執行了)。

Update() 更新方法

只要腳本處于激活狀態之下,每一幀都會調用Update()

LateUpdate() 延遲更新方法

處于激活狀態下,在Update()調用后會調用LateUpdate()

FixedUpdate() 固定更新函數

在游戲運行過程中,每一幀處理的時間是不固定的。當需要固定間隔執行一些代碼時就會用到FixedUpdate()函數。也是在激活狀態下。
固定調用時間可以在:Edite -> Project Settings -> Time 下的 Fixed Timestep 設置

OnDestory() 銷毀事件

當前腳本銷毀時調用。

OnDisable() 禁用事件

在腳本被禁用時調用(每次禁用都會調用)

OnEnable() 激活事件

腳本在激活時調用(每次激活都會調用)

OnGUI()

繪制GUI時調用。現在一般不適用此GUI。Untiy有了UGUI

3 調試

Debug.Log() 輸出普通信息(白色)
Debug.LogWarning() 輸出警告信息(黃色)
Debug.LogError() 輸出錯誤信息(紅色)
void Start(){
    Debug.Log("log...");
    Debug.LogWarning("warning....");
    Debug.LogError("error....");
}

4 游戲對象的操作

4.1 創建游戲物體


void Start(){

    // 創建膠囊體
    GameObject.CreatePrimitive(PrimitiveType.Capsule);

}

PrimitiveType類型:

類型 說明
Capsule 膠囊體
Sphere 球體
Cylinder 圓柱體
Cube 正方體
Plane 平面
Quad

4.2 獲取游戲對象

通過指定

using System;
using UnityEngine;
public class Test : MonoBehaviour{

    public GameObject myCube;

    void Start(){

    }

}

Hierarchy視圖中拖一個游戲物體到My Cube后面;或者點小圓圈選擇一個。

同過代碼獲取游戲對象

using System;
using UnityEngine;
public class Test : MonoBehaviour{

    public GameObject myCube;

    void Start(){
        // 通過游戲名稱查找游戲對象
        myCube = GameObject.Find("Cube");
        // 通過標簽查找游戲對象
        myCube = GameObject.FindWithTag("Player");
        // 也是通過游戲標簽獲取一個游戲對象
        myCube = GameObject.FindGameObjectWithTag("Palyer");

        // 通過標簽獲取多個游戲對象
        var list = GameObject.FindGameObjectsWithTag("cubes");
        
        // 通過類型或游戲對象
        var obj = GameObject.FindObjectOfType(typeof(Rigidbody));

        // 通過類型獲取對象
        var lists = GameObject.FindObjectsOfType(typeof(Rigidbody));
    }

}

5 添加組件和修改組件

void Start(){

    // 向當前游戲對象添加一個 剛體組件
    gameObject.AddComponent<Rigidbody>();

    // 獲取當前游戲對象上的 剛體 組件
    var rigidbody = GetComponent<Rigidbody>();

    // 修改組件值
    rigidbody.mass = 100;
}

其他組件操作都一樣

6 發送消息

游戲對象間通訊

使用GameObject.SendMessage()方法

// 方法名:要在游戲對象中調用的方法;
GameObject.SendMessage(string methodName);
// 方法名 和 要傳遞的`參數`
GameObject.SendMessage(string methodName, object value);
// 方法名 和 配置項->
GameObject.SendMessage(string methodName, SendMessageOptions option);
SendMessageOptions
DontRequireReceiver 不需要回應
RequireReceiver 必須回應
GameObject.SendMessage(string methodName,object value ,SendMessageOptions option);

游戲對象A代碼:

    void Start(){
        // 獲取發送消息的游戲對象
        var myCube = GameObject.Find("TestCube");

        if(myCube != null){
            
            // 向獲取到的游戲對象發送消息
            myCube.SendMessage("methodName");

        }
    }

TestCube游戲對象中代碼:

// 額外添加 methodName 讓A對象里的 SendMessage 調用。
public void methodName(){
    print("call....");
}

SendMessageUpWards 向物體和父物體發送消息

BroadcastMessage 對物體和所有子物體發送消息(廣播消息)

7 克隆游戲物體 Instantiate方法


// 手動在unity編輯中賦值
public GameObject cube;

void Start(){

    // 克隆cube  第一個參數就是 cube變量  第二個參數:克隆的游戲物體在世界中的這邊  第三個參數:不旋轉
    var go = Instantiate(cube,Vector3.zero,Quaternion.identity);
}

8 移動、旋轉和縮放游戲對象(Transform組件)

每個游戲物體都會有一個Transform組件,這個組件是無法移除的。
Transform面板一共包含3個屬性:Position(位置) Rotation(旋轉) Scale(縮放)


我們可以用Scene視圖工具


來拖動和旋轉游戲對象,也可以直接改變Transform組件里的值。

8.1 游戲對象的位置

在3D世界中,任何一個模型的三維坐標都保存在Vector3結構中,該結構保存了 x坐標,y坐標,z這邊。改變Vector3結構里面的值,對應場景里面模型也會改變位置。

8.2 移動游戲對象

using UnityEngine;
public class Test : MonoBehaviour{

    void Update(){
        // 直接改變
        transform.position = new Vector3(0, 100, 0);

        // 相當于在游戲對象的當前位置 加上 給定的 Vector3
        transform.Translate(new Vector3(0, 0, 10));

    }

}

8.3 縮放游戲對象

// x為x軸向的縮放,y為y軸向的縮放,z為軸向的縮放
transform.localScale = new Vector3(x, y, z);

// 整體縮放 1.5 倍;
transform.localScale *= 1.5f;

8.4 旋轉游戲對象

旋轉有兩種:

  • 自轉
  • 圍繞旋轉 圍繞一個點旋轉
// 設置對象自轉,按照z軸自轉
transform.Rotate(Vector3.forward);

// 圍繞一個點旋轉  圍繞的位置  按照z軸旋轉  旋轉角度
transform.RotateAround(myCube.transform.position, Vector3.forward, 2);

8.4 工具類

Time類

Time.time 當前游戲時間
Time.timeScale 游戲時間的縮放,當設置為0.5f時,現實過去1秒,游戲過去0.5秒。
Time.deltaTime 上一幀所消耗是時間
Time.fixedTime 每一次執行FiexdUpdate的時間間隔
Time.fixdDeltaTime 固定更新上一幀消耗的時間
Time.realtimeSinceStartup 從游戲開始一直到現在的真實時間,不受Time.Scale影響。

Random類

Random.Range(int min,int max) 生成 min 到 max范圍的隨機數,返回int
Random.Range(float min,float max) 生成 min 到 max范圍的隨機數,返回float

8.5 輸入控制Input

鍵盤:

Input.GetKeyDown(KeyCode.W) 按下 W

Input.GetKeyUp(KeyCode.S) 放開 S

Input.GetKey(KeyCode.A) 按住 A

鼠標:

Input.GetMouseButton(0) 鼠標 左鍵 按住

Input.GetMouseButtonDown(1) 鼠標 右鍵 按下

Input.GetMouseButtonUp(2) 鼠標 中鍵 抬起

自定義輸入

主菜單 -> Edit -> Project Settings -> Input -> Axes

Size 可以改變Axes下的數量
Horizontal菜單 (其它菜單參數都一樣)
4_1.png
Name 名稱
Descripttive Name 描述
Descripttive Negative Name 描述負數
Negative Button 負按鈕
Positive Button 正按鈕
Alt Negative Button 次要 負按鈕
Alt Positive Button 次要 正按鈕
Gravity 重力 按鈕力度
Dead 小于這個數的正值或負值 都將設置為0
Sensitivity 靈敏度
Snap 在接受到相反的輸入,將立即重置為0
Invert 反向,正的變負的
Type 輸入類型:
Key or Mouse Button 按鍵
Mouse Movement鼠標移動
Joystick Axis操縱桿
Axis 來自設備的輸入軸
Joy Num 使用哪個操縱桿

通過代碼來獲取(Axis)輸入

// 獲取`Axes`下 名稱為 Horizontal 的輸入
float horizontal = Input.GetAxis("Horizontal");

因為Horizontal設置主要按鈕為:<-(方向鍵左) ->(方向鍵右) 次要按鈕:a d
按下(A) horizontal就會時負值 (D) horizontal就是正值

移動設備輸入Touch

觸碰

fingerId 手指id
phase 手指的階段
position 按下的坐標

Began 開始接觸屏幕
Moved 移動
Stationary 靜止
Ended 離開屏幕
Canceled 系統關閉觸摸屏
重力感應Acceleration
Vector3 posistion = Input.acceleration

posistion.x 正向為設備向右
posistion.z 正向為設備使用者方式
posistion.y 正向為設備向上

其它相關API
Input.deviceOrientation 當前游戲運行朝向
Input.touchSupported 是否支持手指觸碰操作
Input.multiTouchEnable 是否支持多點觸碰

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容