大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 在软件开发的时候,可能会遇到程序的物体生成,虽然比较简单,但还是小记录一下,如有需要可以看两眼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Clone_1 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GameObject gameObject = new GameObject();
GameObject gameObject1 = new GameObject("物体名字");
}
}
从效果图可以看出,场景一运行就会生成两个物体,一个有名字一个没有名字,停止之后物体会自动销毁,生成物体的时候还可以添加其他组件(如碰撞盒…)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Clone_2 : MonoBehaviour
{
public GameObject prefab1;
public GameObject prefabFather;
// Start is called before the first frame update
void Start()
{
Instantiate(prefab1); //直接生成物体
Instantiate(prefab1, prefabFather.transform); // 生成物体的时候给物体设置父物体
//生成物体并设置父物体的时候是否保持原始的世界位置 false不保留 true保留
Instantiate(prefab1, prefabFather.transform,false);
//Quaternion.identity 对象与世界轴或父轴完美对齐(没有旋转)
Instantiate(prefab1, prefabFather.transform.position,Quaternion.identity);
//Quaternion.identity 对象与世界轴或父轴完美对齐(没有旋转)同时设置父物体
Instantiate(prefab1, prefabFather.transform.position,Quaternion.identity, prefabFather.transform);
}
// Update is called once per frame
void Update()
{
}
}

创建系统内置的基础物体,比如Cube(正方体),Plane(平面),Sphere(球体),胶囊体, 球体,圆柱体。 有时候不知道为什么,测试用的时候总是忘记系统生成的api这次就写一次,嘻嘻
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Clone_3 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//生成正方体
GameObject.CreatePrimitive(PrimitiveType.Cube);
//生成球体
GameObject.CreatePrimitive(PrimitiveType.Sphere);
//生成胶囊体
GameObject.CreatePrimitive(PrimitiveType.Capsule);
//生成圆柱体
GameObject.CreatePrimitive(PrimitiveType.Cylinder);
//生成占用内存大的平面
GameObject.CreatePrimitive(PrimitiveType.Plane);
//生成占用内存小的平面
GameObject.CreatePrimitive(PrimitiveType.Quad);
}
}
不管是Transform还是GameObject都是可以用Instantiate的因为他们两个都是继承的是Object
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Clone_4 : MonoBehaviour
{
public Transform prefab;
public Transform fatherTransform;
// Start is called before the first frame update
void Start()
{
//用法和Clone_2脚本里面的一样,这里就不多介绍了
Transform tran = Instantiate(prefab);
Transform tran1 = Instantiate(prefab,fatherTransform);
Transform tran2 = Instantiate(prefab,fatherTransform,false);
Transform tran3 = Instantiate(prefab,fatherTransform.position,Quaternion.identity ,fatherTransform);
}
}
1.新建一个脚本组件CubePrefab.cs挂载到生成的cube上面,制作成预制体 2.预制体效果如下

3.编辑刚刚创建的脚本,新增一个bool属性(isbool) 4.新增完之后的预制体效果图,就会多出一个勾选框

这时候就可以实例化了 5.代码如下 cubePrefab拖刚刚制作的预制体就ok了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Clone_5 : MonoBehaviour
{
public CubePrefab cubePrefab;
// Start is called before the first frame update
void Start()
{
for (int i = 0; i < 5; i++)
{
CubePrefab obj = Instantiate(cubePrefab);
obj.isbool = true;
}
}
}6.效果图如下

全选这几个cube你就会发现上面的bool属性全是勾选状态,测试结束 其他需要请自行扩展
补充:
原理 复用机制:预先创建一组对象,使用时激活,闲置时隐藏而非销毁。
减少开销:避免频繁的内存分配与回收,显著优化性能。
代码示例
public class ObjectPool : MonoBehaviour
{
public GameObject prefab;
public int initialSize = 10;
private Queue<GameObject> pool = new Queue<GameObject>();
void Start()
{
for (int i = 0; i < initialSize; i++)
{
GameObject obj = Instantiate(prefab);
obj.SetActive(false);
pool.Enqueue(obj);
}
}
public GameObject GetObject()
{
if (pool.Count == 0)
{
// 动态扩容
GameObject obj = Instantiate(prefab);
pool.Enqueue(obj);
}
GameObject reusedObj = pool.Dequeue();
reusedObj.SetActive(true);
return reusedObj;
}
public void ReturnObject(GameObject obj)
{
obj.SetActive(false);
pool.Enqueue(obj);
}
}注意事项 初始化大小:根据需求设置合理的初始池大小,避免运行时频繁扩容。
状态重置:对象被回收时需重置位置、旋转、物理状态等属性。
池的管理:为不同类型对象创建独立池,防止混杂逻辑。
通用注意事项

以上就是讲了几种创建生成的方法, 不定时更新Unity开发技巧,觉得有用记得一键三连哦。感谢