前言
脚本中可以通过预制件创建游戏对象,这样做法相比于直接在Hierarchy Window 中创建更加灵活。
如在游戏角色发射子弹时,这种情况需要游戏角色响应用户输入的同时创建子弹的游戏对象,如果不使用脚本我想不到能怎么去实现这样的需求。
预制件
之前博客中所用到的,在资源文件夹中创建的精灵,动画,游戏对象都是预制件。
也可以通过拖拽Hierarchy Window中的游戏对象到资源文件,这样也会自动生成一个预制件。
个人理解,预制件有点像是高级语言中类的概念,把预制件放到游戏游戏场景中就是实例化一个类对象。
用预制件在Hierarchy Window中创建的对象图标会是蓝色的,直接创建的对象是灰色的。
使用脚本创建游戏对象
public static Object Instantiate (Object original); public static Object Instantiate (Object original, Transform parent); public static Object Instantiate (Object original, Transform parent, bool instantiateInWorldSpace); public static Object Instantiate (Object original, Vector3 position, Quaternion rotation); public static Object Instantiate (Object original, Vector3 position, Quaternion rotation, Transform parent);
original | 要复制的现有对象。 |
---|---|
position | 新对象的位置。 |
rotation | 新对象的方向。 |
parent | 将指定给新对象的父对象。 |
instantiateInWorldSpace | 当你分配一个父对象时,传递true来直接在世界坐标系中定位新对象。传递false来设置对象相对于它的新父对象的位置。 |
使用这个函数,就可以在场景中创建新的游戏对象,与其说是创建,不如说是复制,因为所有的函数声明中都需要传入一个源游戏对象。
所以一般使用的时候会这样使用:
public GameObject obj; .... GameObject newObj = Instantiate(obj, transform.position, Quaternion.identity);
创建一个public成员作为源对象,然后在使用脚本时可以在Inspector Window中设置源对象的对象类型,做法是讲源对象的预制件拖拽到Inspector Window。其实也就是使用预制件创建了一个对象,然后把这个对象用于初始化 obj成员(如果对这部分操作感到迷惑,可以去看以下之前的博文:[C#脚本的简单使用方法]())。
这一切准备好之后就脚本就能顺利的创建对象了。
关于这里传入的参数,transform.position 是当前游戏对象的位置,Quaternion.identity 与Quaternion(0,0,0,0)是等价,表示不做旋转操作。
public GameObject obj; void Update() { if (Input.GetKeyDown(KeyCode.Space)) { GameObject bulletInstance = Instantiate(Bullet, transform.position, Quaternion.identity); } }
如果将代码改成这样,那么在用户按下空格键的时候会在当前游戏对象的位置复制一个obj 对象。
文章评论