您现在的位置是:首页 >技术交流 >【Unity入门】22.动态创建实例网站首页技术交流
【Unity入门】22.动态创建实例
【Unity入门】动态创建实例
大家好,我是Lampard~~
欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢
(一)脚本实例化预制体对象
(1)Instantiate克隆创建对象
昨天我们学习了预制体这个概念,在编辑器中使用预制体创建游戏对象,并学习如何修改预制体等。今天主要来学习,如何在脚本中利用预制体创建游戏对象
毕竟如果要创建成百上千个对象的时候,在编辑器中一个个摆是不现实的,而我们使用到的方法就是Object的Instantiate方法
Object.Instantiate 是 Unity 中一个用于在场景中创建新对象的函数。它可以用于实例化预制体、复制已有游戏对象等等
那要如何做呢?首先把我们需要作为克隆模板的预制体定义为全局参数,并在编译器中赋值然后就可以在脚本中访问到预制体了(为了方便我就写在mainLogic了)
紧接着在脚本中我们调用Instantiate即可创建多个预制体,Instantiate重载了很多种方法,我们使用比较简单的,传入两个参数,参数1为预制体模板,参数2为挂载的父节点(传null就会挂在根节点上),代码如下:
void Update()
{
if (Input.GetMouseButtonDown(0))
{
GameObject newEarth = Instantiate(earthPrehab, null);
}
}
通过以下代码我们就可以每点击一次,就生成一个物体对象了
全部都生成在根节点下有点丑,我们可以创建一个结点管理这些生成的对象,然后在代码中把的父节点传入这个就可以了
void Start()
{
earthPrefabNode = GameObject.Find("EarthPrefabNode");
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
GameObject newEarth = Instantiate(earthPrehab, earthPrefabNode);
}
}
奇怪的事情发生了,此时代码居然报错了,原因在于传入的父类需要transform类型
好吧大家也要注意下,这样改过来就可以了
void Update()
{
if (Input.GetMouseButtonDown(0))
{
GameObject newEarth = Instantiate(earthPrehab, earthPrefabNode.transform);
}
}
(2)Destory删除对象
有创建那就有删除,我们可以通过Destory方法删除对象。这里的删除是游戏执行到下一帧才进行的,就有点像cocos里面的clone和release方法
Object.Destroy 是 Unity 中用于销毁游戏对象和组件的函数,它可以在游戏运行时销毁对象,也可以在场景加载后销毁对象。使用它可以帮助开发者优化游戏性能,释放不再需要的资源
好吧,那我们直接来试试,如鼠标右键就删除克隆出来的对象,如果childCnt 不大于0(删完了)就不执行了
if (Input.GetMouseButtonDown(1))
{
int childCnt = earthPrefabNode.transform.childCount;
Transform tr = earthPrefabNode.transform;
if (childCnt > 0)
{
Debug.Log("删除游戏对象");
Destroy(tr.GetChild((childCnt - 1)).gameObject);
}
}
看看效果:
好啦今天就到这里,谢谢各位感谢阅读!!!
点赞,关注!!!