Daily Archives: 2021 年 04 月 15 日

Hello World

Unity笔记–利用预制体动态创建对象

使用Unity制作射击游戏,屏幕内的每一个子弹都需要一个游戏对象,如果是单发武器还好,项目里复制几个对象,然后下面的代码就能不断循环使用。

1
2
    transform.SetAsLastSibling();
    bulletsTransform = transform.GetChild(0);

但如果需要使用连发武器,比如加特林之类的,同一时间屏幕上可能会出现许多的子弹。如果还是事先复制一堆子弹对象,就显得特别low,这里就需要动态创建子弹对象了。
首先,新建预制体子弹对象“Bullet1”,然后将其拖入Assets/Resources目录内(只有名为“Resources”目录内的资源才能动态加载)。
然后就可以在代码内创建、使用预制体对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
    //代码片段1,加载预制体, 创建对象
    GameObject bullet = Resources.Load("Bullet1") as GameObject; //加载预制体
    bullet = Instantiate(bullet); //使用这种方式加载预制体,必须序列化后才能使用
    bullet.transform.parent = cannonsTransform; //设置父级对象
    bullet.transform.localScale = bulltScale; //设置大小。。。预制体似乎为包含拖到修改大小的信息,这里使用中一个Vector3对象重新设置其大小
    bullet.transform.position = beginPos; //使用一个Vector3对象,设置初始位置
    runingBullets.Add(bullet.transform); //加入到队列
 
    //代码片段2,销毁预制体
    if(...){
        Destroy(runingBullets[i].gameObject); //销毁对象
        runingBullets.RemoveAt(i); //移出队列
    }

再unity中,创建对象是很耗资源的操作,正式项目建议创建后不要轻易销毁,而是通过SetActive(false/true)循环使用。
——-
原创内容,转载请注明出处:http://www.jiangkl.com/2021/04/unity_new_prefabs