C語言中文網 目錄

Unity 3D腳本應用實例演示(三個實例)

在我們學會如何編寫一個 Unity 3D 腳本之后,要怎么應用這些腳本呢,接下來我們以案例的形式帶大家了解一下游戲開發中 Unity 3D 腳本的應用。

實踐案例:創建游戲對象

案例構思

游戲場景中出現的所有物體都屬于游戲對象,游戲對象之間的交互都可以通過腳本來控制并實現。

創建游戲對象的方法有 3 種:
  • 第一種是將物體模型資源由 Project 視圖直接拖曳到 Hierarchy 面板中;
  • 第二種是在 Unity 3D 菜單 GameObject 中創建 Unity 3D 自帶的游戲對象,如 Cube、Camera、Light 等;
  • 第三種是利用腳本編程,動態創建或刪除游戲對象。

本實踐案例采用第三種方法,即利用腳本動態創建游戲對象。

利用腳本動態創建游戲對象的方法又分為兩種:
  • 使用 CreatePrimitive 方法創建 Unity 3D 系統自帶的基本游戲對象;
  • 使用 Instantiate 實例化方法將預制體實例化為對象。

初始場景效果

創建Cube后的效果

案例設計

本案例通過 C# 腳本在 Unity 3D 內創建一個 Cube 模型和一個 Sphere 模型,通過屏幕左上方按鈕控制 Cube 和 Sphere 模型創建,如下圖所示。

運行測試效果

案例實施

步驟 1):使用 CreatePrimitive 方法創建 Unity 3D 系統自帶的基本游戲對象,創建腳本輸入代碼。
using UnityEngine;
using System.Collections;
public class CreatePrimitive:MonoBehaviour{
    OnGUI(){
        if(GUILayout.Button("CreateCube", GUILayout.Height(50))){
            GameObject m_cube=GameObject.CreatePrimitive(PrimitiveType.Cube);
            m_cube.AddComponent<Rigidbody>();
            m_cube.GetComponent<Renderer>().material.color=Color.blue;
            m_cube.transform.position=new Vector3(0, 10, 0);
        }
        if(GUILayout.Button("CreateSphere", GUILayout.Height(50))){
            GameObject m_cube=GameObject.CreatePrimitive(PrimitiveType.Sphere);
            m_cube.AddComponent<Rigidbody>();
            m_cube.GetComponent<Renderer>().material.color=Color.red;
            m_cube.transform.position=new Vector3(0, 10, 0);
        }
    }
}
在上述 OnGUI() 函數中,單擊 CreateCube 按鈕或 CreateSphere 按鈕后,將分別調用 CreatePrimitive 方法,從而創建 Cube 和 Sphere 游戲對象,并且為這兩個游戲對象添加剛體、顏色以及位置屬性,運行效果如下圖所示。

運行測試前

運行測試后

步驟 2):使用 Instantiate 實例化方法將預制體實例化為對象。

當制作好了游戲組件(場景中的任意一個 GameObject)后,將它制作成一個組件模板,用于批量的套用工作,例如場景中“重復”的東西——“敵人”“士兵”“子彈”……稱為預制體。

默認生成的預制體其實就像克隆體,其內儲存著一個游戲對象,包括游戲對象的所有組件及其下的所有子游戲對象。

創建預制體

首先在場景中創建一個立方體,然后在 Project 面板中單擊 Create 菜單的下拉三角,在出現的對話框中選擇 Prefab 創建一個預制體,并為其命名為 MyCube,如下圖所示。

創建預制體
然后在 Hierarchy 視圖中將立方體拖曳至 Project 視圖中的 MyCube,完成預制體的制作并與立方體 Cube 關聯。在 Hierarchy 視圖中與預制體關聯的游戲對象為藍色,如下圖所示。

關聯預制體

預制體實例化

將預制體復制一份到場景里的過程叫實例化,在 Project 面板中將預制體拖曳到 Inspector 面板中可以實例化一個對象。

預制體的實例化不是普通的復制,預制體實例化后產生的新游戲對象依然保持著與預制體的關聯,也就是預制體進行添加組件、修改組件屬性等改變,預制體實例化產生的游戲對象也會發生相應的改變。
if(Input.GetButtonDown("Fire1")){
    Instantiate(newObject, transform.position, transform.rotation);
}
上述代碼中調用 Instantiate 方法實例化游戲對象與調用 CreatePrimitive 方法創建游戲對象的最終結果是完全一樣的,實例化游戲對象會將對象的腳本及所有繼承關系實例化到游戲場景中。

Instantiate 實例化方法比創建物體的 CreatePrimitive 方法執行效率要高很多。

在開發過程中通常會使用 Instantiate 方法實例化對象,Instantiate 方法調用時一般與預制體 Prefab 結合使用。

實踐案例:旋轉的立方體

案例構思

在腳本編寫中經常用到移動、旋轉、縮放功能,可以使用 transform.Translate()、transform.Rotate() 和 transform.localScale 方法實現。

本案例旨在通過一個立方體讓讀者掌握腳本編譯中移動、旋轉、縮放的函數編寫以及與 OnGUI 函數交互功能的實現。

案例設計

本案例計劃通過 C# 腳本在 Unity 內創建一個簡單的 Cube 模型,采用 OnGUI 方法寫 3 個交互按鈕,實現與 Cube 模型進行移動、旋轉、縮放的交互功能,如下圖所示。

初始場景效果

移動立方體效果

旋轉立方體效果

縮放立方體效果

案例實施

步驟 1):為游戲項目里的游戲場景添加兩個游戲對象:Cube 和 Directional,前者是腳本要操作的游戲對象,后者是負責游戲場景照明的游戲對象。

然后創建一個 Plane 位于 Cube 下方。調整游戲場景中 3 個游戲對象的位置,使得 Game 視圖達到最佳的效果,如下圖所示。

游戲場景物體擺放圖

步驟 2):在 Project 視圖里,新建一個 C# 腳本,命名為 MyScript,打開此腳本并添加下面的代碼:
using UnityEngine;
using System.Collections;
public class MyScript:MonoBehaviour
{
    //聲明4個變量
    public GameObject myCube;
    public int transSpeed=100;
    public float rotaSpeed=10.5f;
    public float scale=3;
    void OnGUI(){
        if(GUILayout.Button("移動立方體")){
            myCube.transform.Translate(Vector3.forward*transSpeed*Time.deltaTime, Space.World);
        }
        if(GUILayout.Button("旋轉立方體")){
            myCube.transform.Rotate(Vector3.up*rotaSpeed, Space.World);
        }
        if(GUILayout.Button("縮放立方體")){
            myCube.transform.localScale=new Vector3(scale, scale, scale);
        }
    }
}
腳本聲明了 4 個變量,且都使用 public 修飾,所以它們可以作為屬性出現在組件下。

OnGUI() 函數用于在界面中顯示按鈕,玩家可以通過單擊按鈕實現與立方體的交互功能。

步驟 3):將腳本 MyScript 賦予 Main Camera。

步驟 4):運行游戲,在 Game 視圖的左上角會出現 3 個按鈕:“移動立方體”“旋轉立方體”和“縮放立方體”。單擊按鈕,即可完成對立方體對象的指定操作,如下圖所示。

運行測試效果

綜合案例:第一人稱漫游

案例構思

虛擬漫游可以提升游戲玩家的沉浸感,Unity 3D 中提供了第一人稱以及第三人稱虛擬漫游的組件。

如何編寫一段腳本實現虛擬漫游功能呢?本案例旨在通過腳本實現第一人稱虛擬漫游功能,讓讀者深入掌握編寫 Unity 3D 腳本實現游戲功能的方法。

案例設計

本案例在場景內擺放一些基本幾何體,構建簡單的 3D 場景,采用 C# 腳本開發第一人稱虛擬漫游功能,通過鍵盤 W、S、A、D 鍵在場景內自由行走,通過鼠標實現觀察者視角的旋轉功能,如下圖所示。

第一人稱虛擬漫游測試效果

案例實施

步驟 1):執行 GameObject→3D Object→Plane 命令創建一個平面。

步驟 2):執行 GameObject→Create Empty 命令創建空物體,并將標簽設為 Player。

打開標簽管理器

一個標簽是用來索引一個或一組游戲對象的詞。標簽是為了編程的目的而對游戲對象的標注,游戲開發人員可以使用標簽來書寫腳本代碼,通過搜索找到包含想要的標簽的對象。

添加標簽方法很簡單,選中 Inspector 面板右上方的 Tag,點擊 Add Tag 將在檢視面板打開標簽管理器,然后在里面輸入 Player,如上圖所示。

然后再次選擇空物體,在 Tag 的下拉列表中找到 Player 標簽,完成添加標簽,如下圖所示。

添加標簽

步驟 3):為主角添加角色控制器組件。執行 Component→Physics→Character Controller 命令,如下圖所示。

角色控制器主要用于第三人稱或第一人稱游戲主角控制,并不使用剛體物理效果,具體參數如下表所示。

添加Character Controller組件
參 數 含 義 功 能
Slope Limit 坡度限制 限制碰撞器只能爬小于等于該值的斜坡
Step Offset 臺階高度 角色可以邁上的最高臺階高度
Skin Width 皮膚厚度 皮膚厚度決定了兩個碰撞器可以互相滲人的深度
Min Move Distance 最小移動距離 如果角色移動的距離小于該值,角色就不會移動
Center 中心 該值決定膠囊碰撞器在世界空間中的位置
Radius 半徑 膠囊碰撞器的橫截面半徑
Height 高度 膠囊碰撞器的高度

步驟 4):添加 Rigidbody 組件,取消選中 Use Gravity 復選框,選中 Is Kinematic 復選框使其不受物理影響,而是受腳本控制,如下圖所示。

添加剛體組件

步驟 5):調整 Character Controller 的位置和大小,使其置于平面之上。

步驟 6):創建 C# 腳本,將其命名為 Player。

步驟 7):輸入如下代碼:
using UnityEngine;
using System.Collections;
public class Player:MonoBehaviour{
    public Transform m_transform;
    //角色控制器組件
    CharacterController m_ch;
    //角色移動速度
    float m_movSpeed=3.0f;
    //重力
    float m_gravity=2.0f;
    void Start(){
        m_transform=this.transform;
        //獲取角色控制器組件
        m_ch=this.GetComponent<CharacterController>();
    }
    void Update(){
        Control();
    }
    void Control(){
        //定義3個值控制移動
        float xm=0, ym=0, zm=0;
        //重力運動
        ym-=m_gravity*Time.deltaTime;
        //前后左右移動
        if(Input.GetKey(KeyCode.W)){
            zm+=m_movSpeed*Time.deltaTime;
        }else if(Input.GetKey(KeyCode.S)){
            zm-=m_movSpeed*Time.deltaTime;
        }
        if(Input.GetKey(KeyCode.A)){
            xm-=m_movSpeed*Time.deltaTime;
        }else if(Input.GetKey(KeyCode.D)){
            xm+=m_movSpeed*Time.deltaTime;
        }
        //使用角色控制器提供的Move函數進行移動
        m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));
    }
}
上述代碼主要是控制角色前后左右移動。

在 Start 函數中,首先獲取 CharacterController 組件,然后在 Control 函數中通過鍵盤操作獲得 X 和 Y 方向上的移動距離,最后使用 CharacterController 組件提供的 Move 函數移動角色。

使用 CharacterController 提供的功能進行移動時,會自動計算移動體與場景之間的碰撞。

步驟 8):在 Hierarchy 視圖中選中 Player 游戲對象,在其 Inspector 屬性面板中選擇 Component→Script,選擇 Player 腳本將其鏈接到 Player 游戲對象上,如下圖所示。

player腳本鏈接

步驟 9):此時運行測試,按 W、S、A、D 鍵可以控制主角前后左右移動,但是在 Game 視圖中卻觀察不到主角在場景中移動的效果,這是因為攝像機還沒有與主角的游戲對象關聯起來,需要添加攝像機代碼。打開 Player.cs,添加如下代碼:
//攝像機Transform
Transform m_camTransform;
//攝像機旋轉角度
Vector3 m_camRot;
//攝像機高度
float m_camHeight=1.4f;
//修改Start函數, 初始化攝像機的位置和旋轉角度
void Start(){
    m_transform=this.transform;
    //獲取角色控制器組件
    m_ch=this.GetComponent<CharacterController>();
    //獲取攝像機
    m_camTransform=Camera.main.transform;
    Vector3 pos=m_transform.position;
    pos.y+=m_camHeight;
    m_camTransform.position=pos;
    //設置攝像機的旋轉方向與主角一致
    m_camTransform.rotation=m_transform.rotation;
    m_camRot=m_camTransform.eulerAngles;
    //鎖定鼠標
    Screen.lockCursor=true;
}
void Update(){
    Control();
}
void Control(){
    //獲取鼠標移動距離
    float rh=Input.GetAxis("Mouse X");
    float rv=Input.GetAxis("Mouse Y");
    //旋轉攝像機
    m_camRot.x-=rv;
    m_camRot.y+=rh;
    m_camTransform.eulerAngles=m_camRot;
    //使角色的面向方向與攝像機一致
    Vector3 camrot=m_camTransform.eulerAngles;
    camrot.x=0;camrot.z=0;
    m_transform.eulerAngles=camrot;
    //操作角色移動代碼
    //使攝像機位置與角色一致
    Vector3 pos=m_transform.position;
    pos.y+=m_camHeight;
    m_camTransform.position=pos;
}
上述代碼通過控制鼠標旋轉攝像機方向,使角色跟隨攝像機的 Y 軸旋轉方向,在移動角色時,使攝像機跟隨角色運動。

步驟 10):單擊 Play 按鈕進行測試,效果如下圖所示,通過鼠標操作可以在場景中旋轉視角,通過 W、S、A、D 鍵可以在場景中向前、向后、向左、向右移動。

利用鼠標旋轉移動視角

利用鍵盤控制移動

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo