阅读(3957) (0)

Unity 3D 实践案例一

2020-07-11 11:22:38 更新

游戏场景中出现的所有物体都属于游戏对象,游戏对象之间的交互可通过脚本的控制来实现。

创建游戏对象的方法:

  1. 将物体模型资源由 Project 视图直接拖拽到 Hierarchy 面板中。
  2. 在 Unity 3D 菜单 GameObject 中创建 Unity 3D 自带的游戏对象,如 Cube、Camera、Light 等。
  3. 利用脚本编程,动态的创建或删除游戏对象。

本案例使用第三种方法进行讲解。即利用脚本动态创建游戏对象。 利用脚本动态创建游戏对象的方法又分为两种。

  • 使用 CreatePrimitive 方法创建 Unity 3D 系统自带的基本游戏对象。
  • 使用 Instantiate 实例化方法将预制体实例化为对象。

案例设计

本案例通过 C# 脚本在 Unity 3D 中创建一个 Cube 模型和一个 Sphere 模型,通过屏幕左上角按钮进行创建操作。

案例实施

  1. 使用 CreatePrimitive 方法创建 Unity 3D 系统自带的基本游戏对象,创建空白脚本写入代码。

    using UnityEngine;
    using System.Collections;
    public class CreatePrimitive:MonoBehaviour{
        void 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 方法,从而创建 CubeSphere 游戏对象,并且为这两个游戏对象添加刚体、颜色以及位置属性。

  1. 使用 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 结合使用。