如何在 Unity3D 中編寫基於物理的角色控制器

如何在 Unity3D 中編寫基於物理的角色控制器

角色控制器可以幫助您在遊戲中實現簡單的運動物理。

您可以從多個角度接近 Unity3D 角色控制器。如果您使用具有強大類和函數的庫,創建基於物理的角色控制器可能是開始遊戲開發的一個有趣的地方。

第 1 步:使用玩家和地形對象創建場景

unity 角色控制器 3d 空間

打開 Unity 並創建新項目後,您可以開始向場景添加幾個對象。您可以按照您喜歡的任何順序創建這些對象,但要小心確保使用正確的設置。雖然這個項目很基礎,但它是開始使用 Unity 的好方法。

地形的 3D 平面對象

添加到場景中的第一個對像是平面。在層次結構窗格內右鍵單擊,將鼠標懸停在3D對像上,然後從列表中選擇平面。您可以調整平面的大小以提供更大的測試區域,但您無需對其進行任何其他操作。

立方體對象播放器模型

接下來,是時候在場景中添加一個立方體作為玩家模型了。在層次結構窗格內右鍵單擊,將鼠標懸停在3D Object上,然後從下拉菜單中選擇Cube 。放置新立方體,使其位於您還添加的平面上方。您還需要添加一個剛體組件,使立方體成為一個物理對象。

選擇立方體並轉到檢查器。單擊窗格底部的添加組件,搜索剛體,並在出現時從列表中選擇剛體。勾選使用重力複選框並保留其餘設置不變。

您可以在線找到免費的 Unity 資產來美化您的項目。

第三人稱相機

您的場景應該已經有一個可以用作第三人稱相機的相機。將相機放置在立方體上方舒適的第三人稱位置。在將相機拖放到立方體上以創建父子關係之前,請轉到層次結構窗格。完成此操作後,相機將自動跟隨您的立方體。

快速測試

雖然您的場景還沒有任何代碼,但您可以測試到目前為止所做的工作。單擊屏幕頂部的“播放”按鈕以加載您的遊戲。您應該看到立方體下落並落在平面的頂部,並且相機應該跟隨立方體下落。

第 2 步:設置 C# 文件

現在是創建 C# 文件的時候了,這樣您就可以開始編寫一些動作了。轉到“項目”部分,右鍵單擊,將鼠標懸停在“創建”上,然後從列表中選擇“文件夾”。將文件夾命名為 Scripts 或類似名稱。

在新文件夾中導航並重複該過程,但從列表中選擇 C# 腳本。您可以為該文件指定任何名稱,但這也將是其中的主要函數的名稱。確保你的新 C# 看起來像這樣。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Character_Control: MonoBehaviour {
    void Start() {
    }


    void Update() {
    }
}

第 3 步:使用 C# 創建具有速度的前進和後退運動

在腳本文件中添加函數之前,聲明一些公共變量。首先是一個用於存儲玩家模型的剛體。同時聲明一個浮點數來跟踪移動速度。這些變量在主類中,在任何函數之外。

public Rigidbody rigidbody;
public float speed;

接下來,是時候向 Start 函數添加一行代碼了。這使用 GetComponent 聲明將立方體的剛體組件分配給您創建的剛體變量。

void Start() {
    rigidbody = GetComponent < Rigidbody > ();
}

現在您可以添加一些代碼來讓您的播放器模型移動。這段代碼很好,也很簡單;您只需要兩個 if 語句,一個用於向前移動,一個用於向後移動。您可以使用 Input.GetKey 確定何時按下某個鍵。在這種情況下,您正在尋找 W 和 S 鍵的按下。

按下這些鍵中的任何一個都會使用 rigidbody.AddForce 向立方體剛體添加一個力。您可以通過將其 Z 軸位置 (transform.forward) 乘以速度變量來計算所加力的方向和速度。沒有可用於向後運動的 transform.backward 類,但這可以通過將 transform.forward 乘以 -1 來實現。

if (Input.GetKey("w")) {
    rigidbody.AddForce(transform.forward * speed);
}

if (Input.GetKey("s")) {
    rigidbody.AddForce((transform.forward * -1) * speed);
}

保存 C# 文件並導航回 Unity。在“項目”窗格中找到腳本並將其拖放到層次結構中的角色模型立方體上,以將腳本分配給該對象。當您選擇 Cube 時,您應該會在 Inspector 窗格中看到該腳本作為一個組件。在剛體變量框內單擊並選擇立方體的剛體。

您現在可以使用 Play 按鈕啟動遊戲並測試您的代碼。可是等等!有問題;您的立方體將滾動而不是直線向前移動。返回立方體的檢查器,找到 Rigidbody 組件,並勾選方框以在再次啟動遊戲之前凍結 X 軸和 Z 軸上的旋轉。現在它應該工作了。

第 4 步:使用 C# 創建帶扭矩的左轉和右轉

與前後移動不同,轉動 Cube 播放器模型需要一種稱為扭矩的力。為此,您需要另一個變量:一個用於分配扭矩值的公共浮點數。

public float torque;

在此腳本中向左和向右轉的代碼與用於向前和向後移動的代碼也非常相似。每個方向都有一個if語句,用於查找按下 D 鍵(右轉)或 A 鍵(左轉)。

每個 if 語句的第一步是使用 Input.GetAxis 方法確定轉彎方向並將結果分配給浮點變量。在此之後,使用 rigidbody.AddTorque 通過乘以立方體的扭矩、轉動和 Z 軸,將旋轉力應用於立方體角色模型。

if (Input.GetKey("d")) {
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}

if (Input.GetKey("a")) {
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}

保存您的代碼並返回 Unity 進行測試。您可以通過選擇立方體並在腳本中編輯剛體的質量、阻力和扭矩變量來調整玩家模型旋轉的速度和加速時間。此示例項目確定 1 個質量、1 個阻力和 2 個扭矩。

第五步:使用C#編程跳轉

作為這個 Unity 角色控制器的最後一個元素,是時候創建你的跳躍了。考慮到跳躍必須具有有限的高度,因此創建跳躍比您使用過的其他基本控件更複雜。首先添加一個私有布爾變量來跟踪玩家是否在跳躍。

private bool isJumping = false;

如果沒有語句來測試它,這個變量將不會做任何事情。在這種情況下,檢查變量是否為假的基本 if 語句就可以解決問題。將相同的條件添加到另一個移動 if 語句將阻止玩家在跳躍期間移動。

if (!isJumping) {
}

將相同的條件添加到另一個移動 if 語句將阻止玩家在跳躍期間移動。

if (Input.GetKey("w") &&! isJumping) {
    rigidbody.AddForce(transform.forward * speed);
}

內!isJumping if語句,你需要另一個if語句,這次檢查跳轉按鈕的按鍵。將 isJumping 變量設置為 true 是此 if 語句中要做的第一件事,然後進行 rigidbody.angularVelocity 聲明以移除當前應用於立方體的力。

現在您可以使用 rigidbody.AddForce 聲明在其 Z 軸上向立方體添加力,從而創建跳躍的向上運動。最後,是時候在 0.8 秒後使用調用聲明來調用不同的函數了。

if (!isJumping) {
    if (Input.GetKeyDown("space")) {
        isJumping = true;
        rigidbody.AddForce(transform.up * speed * 120);
        rigidbody.angularVelocity = Vector3.zero;
        Invoke("Move_Setter", 0.8 f);
    }
}

此函數將 isJumping 變量設置回 false,以便可以再次移動/跳躍,並且 0.8 秒的延遲會阻止它過早觸發。

void Move_Setter() {
    isJumping = false;
}

第 6 步:測試您的角色控制器代碼

保存您的文件並返回 Unity 以測試您編寫的代碼。與大多數編譯器一樣,Unity 會提供有關代碼錯誤和其他問題的信息,以便更輕鬆地查看您可能需要更改的內容。您可以在我們的 GitHub 頁面上查看此項目的完整代碼。

創建 Unity 角色控制器

在 Unity 中創建角色控制器時,您可以選擇多種不同的方法。使用物理學是一種選擇,但如果需要,您也可以使用內置的角色控制器系統。

像這樣探索不同的選項是了解 Unity 等工具的好方法。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *