Unity 遊戲開發、03 基礎篇 | C#初級程式設計

2023-09-15 06:00:13

C#初級程式設計

https://learn.u3d.cn/tutorial/beginner-gameplay-scripting

8 Update 和 FixedUpdate

Update(不是按固定時間呼叫的) 經常用於

  • 移動非物理特性的物體(不是物理物件)
  • 簡單定時器
  • 接收輸入

FixedUpdate(呼叫時間間隔相同)

  • 進行任何必要的物理計算(任何物理物件)
    • 最好使用力來定義移動

使用 IDE 的 Unity Event Functions 插入函數


9 點積、叉積

  • 值型別對應的值被改變,只會影響特定變數
  • 參照型別指向的值被改變,所有包含相同儲存地址的參照型別變數都會受到影響
    void Start () 
    {
        //值型別變數
        Vector3 pos = transform.position;  // 值拷貝
        pos = new Vector3(0, 2, 0); 
        
        //參照型別變數
        Transform tran = transform;
        tran.position = new Vector3(0, 2, 0);
    }

22 類

  • 拆分類的功能,不要全部寫在一起(單一職責原則)
    • 如射擊類、移動類、庫存類
  • 多用程式碼段,比如 ctor 生成建構函式
  • 先全面仔細設計指令碼結構,再開始編寫一個大類,將各種不同內容囊括其中

23 Instantiate

Instantiate 用於動態生成預製體物件(建立預製件的克隆體)

動態範例化生成的子彈預製體節點被強制轉型成了 RigidBody

public Rigidbody bulletPrefab; // 可以不是GameObject而是繫結的元件
public Transform firePosition;
public float bulletSpeed;   
...
Rigidbody bulletInstance = Instantiate(bulletPrefab, firePosition.position, firePosition.rotation) as Rigidbody;

案例中用到了 as 關鍵字。《C# 8.0本質論》裡沒有寫

  • 按(Rigidbody)顯式轉換方式如果轉換不成功會丟擲異常
  • as 運運算元類似於強制轉換操作;但是,如果轉換不可行,as 會返回 null 而不是引發異常

24 陣列

使用 FindGameObjectsWithTag 初始化查詢所有 Tag 為 Player 的節點儲存至陣列中

C# 陣列是從抽象的基本類型Array派生的參照型別

public GameObject[] players;

void Start()
{
    players = GameObject.FindGameObjectsWithTag("Player");
    foreach (var player in players)   
    {
        Debug.Log($"{player.name}");
    }
}

25 Invoke

  • Invoke 呼叫的函數必須 不包含引數,且無返回值

其他內容以前筆記有寫,略過


26 enum

用整數描述方向不易讀,可以建立 enum 型別(類內類外都可建立

enum Direction : short
{
    North, // 0 
    East,  // 1
    South = 100, // 100
    West   // 101
};
void Start()
{
    Direction myDirection;
    myDirection = Direction.North;
    var newDirection = ReverseDirection(myDirection);
}

Direction ReverseDirection (Direction dir)
{
    if(dir == Direction.North)
        dir = Direction.South;
    else if(dir == Direction.South)
        dir = Direction.North;
    else if(dir == Direction.East)
        dir = Direction.West;
    else if(dir == Direction.West)
        dir = Direction.East;

    return dir;     
}

27 switch

跟 C++ 差不多

public int intelligence = 5;
void Start()
{
    switch (intelligence)
    {
        case 1:
            break;
        case 2:
            break;
        default:
            break;
    }
}