首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Unity 生成物体的几种方式

Unity 生成物体的几种方式

作者头像
心疼你的一切
发布2026-01-20 14:16:52
发布2026-01-20 14:16:52
1080
举报
文章被收录于专栏:人工智能人工智能

前言

大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 在软件开发的时候,可能会遇到程序的物体生成,虽然比较简单,但还是小记录一下,如有需要可以看两眼

👉一、直接new的方式创建生成

1-1.代码如下

代码语言:javascript
复制
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("物体名字");
    }

}

1-2. 效果图

在这里插入图片描述
在这里插入图片描述

从效果图可以看出,场景一运行就会生成两个物体,一个有名字一个没有名字,停止之后物体会自动销毁,生成物体的时候还可以添加其他组件(如碰撞盒…)

👉二、使用Instantiate创建生成(GameObject)

2-1.代码如下

代码语言:javascript
复制
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()
    {
        
    }
}

2-2.效果如下图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

👉三.系统CreatePrimitive创建生成

创建系统内置的基础物体,比如Cube(正方体),Plane(平面),Sphere(球体),胶囊体, 球体,圆柱体。 有时候不知道为什么,测试用的时候总是忘记系统生成的api这次就写一次,嘻嘻

3-1代码如下

代码语言:javascript
复制
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);
    }

   
}

3-2.效果如下图

在这里插入图片描述
在这里插入图片描述

👉四、使用Instantiate创建生成(Transform)

不管是Transform还是GameObject都是可以用Instantiate的因为他们两个都是继承的是Object

4-1.代码如下

代码语言:javascript
复制
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);
    }
}

4-2.效果图

在这里插入图片描述
在这里插入图片描述

👉五、使用组件创建生成

1.新建一个脚本组件CubePrefab.cs挂载到生成的cube上面,制作成预制体 2.预制体效果如下

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

这时候就可以实例化了 5.代码如下 cubePrefab拖刚刚制作的预制体就ok了

代码语言:javascript
复制
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属性全是勾选状态,测试结束 其他需要请自行扩展

补充:

👉五、对象池(Object Pooling)

原理 复用机制:预先创建一组对象,使用时激活,闲置时隐藏而非销毁。

减少开销:避免频繁的内存分配与回收,显著优化性能。

代码示例

代码语言:javascript
复制
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);
    }
}

注意事项 初始化大小:根据需求设置合理的初始池大小,避免运行时频繁扩容。

状态重置:对象被回收时需重置位置、旋转、物理状态等属性。

池的管理:为不同类型对象创建独立池,防止混杂逻辑。

通用注意事项

  1. 内存管理 及时销毁无用对象(Destroy),避免内存泄漏。 使用 Profiler 监控内存与性能(Window > Analysis > Profiler)。
  2. 线程安全 Unity API 需在主线程调用,异步加载时通过回调或协程处理实例化。
  3. 对象生命周期 避免在 Update 中高频生成/销毁对象,优先使用对象池。
  4. 资源引用 使用 Addressables 或 AssetBundle 替代 Resources.Load,提高资源管理灵活性。

👉总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 👉一、直接new的方式创建生成
    • 1-1.代码如下
    • 1-2. 效果图
  • 👉二、使用Instantiate创建生成(GameObject)
    • 2-1.代码如下
    • 2-2.效果如下图
  • 👉三.系统CreatePrimitive创建生成
    • 3-1代码如下
    • 3-2.效果如下图
  • 👉四、使用Instantiate创建生成(Transform)
    • 4-1.代码如下
    • 4-2.效果图
  • 👉五、使用组件创建生成
  • 👉五、对象池(Object Pooling)
  • 👉总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档