unity3d如何删除实例_unity3d实例 - CSDN
  • Unity3d卸载未使用的资源

    千次阅读 2013-03-13 14:16:25
    一般情况下,我们会利用 Unity 的编辑器来部属每个关卡或场景中的物件,这些物件在载入场景后都是必要的,也不太会持续增加物件数,在关卡结束后即转换到下个场景,所以原本场景中的物件 将不再需要,所以 Unity 将...

    通常在变换场景后,上个场景中除了使用 DontDestroyOnLoad() 保留的物件,将会被释放掉,但如果在没有变换场景的情形下,想把未使用的资源卸载掉,该如何做呢?

    一般情况下,我们会利用 Unity 的编辑器来部属每个关卡或场景中的物件,这些物件在载入场景后都是必要的,也不太会持续增加物件数,在关卡结束后即转换到下个场景,所以原本场景中的物件 将不再需要,所以 Unity 将会自动将前一场景的物件都销毁掉,所以我们通常不太需要去管理记忆体的使用或是否释放,但如果你的游戏全部是在单一个场景中运行的,那麼物件的產生、销 毁、释放资源等等的动作就变得格外重要。

    我做了一个宝石类型的游戏,画面上除了 GUI 及背景外就只有宝石,所以我事先将宝石做成 Prefabs ,在需要时利用 Instantiate() 產生,我在不同的关卡利用 renderer.material.mainTexture 变更背景图,利用 GetComponent(MeshFilter).sharedMesh 变更宝石的形状以及利用 renderer.material.color 变更宝石顏色,如此一个Prefabs 可以重复无限使用,所以在游戏场景中只设置了简单几个场景物件,在这种场景不需要变化太多的情况下,每个关卡都换场景重新配置一样的物件似乎有点多餘,所 以这个游戏便只有一个场景,在需要时產生宝石,然后再视情况使用 Destroy() 销毁掉,这样看起来只要在產生宝石时控制画面上的物件数量,那麼也就不用担心记忆体使用过量或没释放掉的问题。

    但是,这个游戏在连续玩好几个关卡后,也就是连续玩一段时间后,会发生停顿或画面变慢的问题,游戏刚开始玩时是相当顺畅的,但长时间执行将使效能降低,直 觉上的判断应该是记忆体累积到一定程度造成的,每个物件在不使用时都使用 Destroy() 销毁掉,那麼,堆积的记忆体是从哪裡来的呢?
    打开 Profiler 视窗看看,会发现其中的 Memory 的 Total Object Count 数值,不断的增减变化,但随着时间的增加会慢慢的往上累积,查看官网 (http://unity3d.com/support/documentation/Manual/Profiler.html) 是这样说的 “If this number rises over time then it means your game is creating some objects that are never destroyed.”,有些物件未销燬,很奇怪吧!都有使用 Destroy(),那為何还有未销毁的物件?其实,主要是因為我这裡有对 renderer.material 设置改变其内容,在这个执行时期并不会真的去改变 Project 中的 material,而是產生这个物件实例(instance) 的材质实例以供该物件使用,所以如果只是 Destroy(gameObject) 的话,将会残留部份物件数,每个產生的物件都残留一点点的话,慢慢的长时间下来将会累积相当多,记忆体将会不敷使用,所以在 Destroy(gameObject) 的同时,应该也要 Destroy(renderer.material) 才行。

    如果程式结构简单,给物件使用的 Script 档案也不多的话,也许多加一句并不困难,但我们有时候无法确定是否有在适当时机為每个物件做到完整的销毁,也许还有残留别的东西也会有这种情形持续累积记 忆体,这时又该寻找更简单统一的方法了,於是我们可以在每个关卡开始前或结束时执行一句 Resources.UnloadUnusedAssets() ,让 Unity 自行去卸载掉不使用的资源,如此在平时物件销毁时,我们已经先行释放掉大部份不使用的资源,然后再由 Resources.UnloadUnusedAssets() 卸载我们未清理掉的部份,如此的话查看 Profiler 视窗的 Memory 的 Total Object Count 数值就可以维持在一定范围内起伏,而不再随着时间增加,当然我们在关卡设置上都会有难度上的差异,在某些关卡裡,玩家可能必须花较多时间才能完成关卡,所 以如果我们只在关卡开始或结束时使用 Resources.UnloadUnusedAssets() 也许会不够,此时也可另外定义每过一段时间就执行 Resources.UnloadUnusedAssets() ,如此将可避免掉系统资源不足的问题。



    来处:http://www.comedreams.com/index.php/archives/41105

    展开全文
  • Unity实例化游戏物体和销毁游戏物体

    万次阅读 多人点赞 2018-07-11 11:45:10
    Unity实例化物体是很常见的,例如坦克大战中你用子弹打中一个坦克之后,分数加1然后场景中又会生成新的坦克。这个过程中就存在一次游戏物体销毁(子弹打中坦克后,坦克销毁)和一次游戏物体实例化(场景中又生成新...

    Unity中实例化物体是很常见的,例如坦克大战中你用子弹打中一个坦克之后,分数加1然后场景中又会生成新的坦克。这个过程中就存在一次游戏物体销毁(子弹打中坦克后,坦克销毁)和一次游戏物体实例化(场景中又生成新的坦克),这算Unity中实例化游戏物体和销毁游戏物体的一个实际应用场景吧。

    首先附上实例化游戏物体的思维导图


    下面来看具体的操作吧。

    1. 在Unity中新建一个场景,创建一个Prefab物体,这里建了名为Box的预制体

    2. 创建一个空的游戏物体用来实例化生成Box

    操作如下:Hierarchy--->Creat Empty--->重命名为CreatBox--->新建一个脚本名称为CreatBox拖拽到CreatBox游戏物体上

    这一步比较简单就不截图了。

    3. 打开CreatBox脚本,写控制游戏物体生成的逻辑代码

    关键代码如下:

    GameObject.Instantiate(Object,Vector3,Quaternion)

    Intantiate方法是静态方法,要用类名GameObject . 调用。

    方法中有三个参数,也很好理解。大家想一想我们要在场景中生成一个游戏物体

    第一个参数 Object 是要生成的游戏物体

    生成的游戏物体在场景中要有一个位置吧,第二个参数Vector3就是游戏物体的生成位置

    第三个参数Quaternion是表示生成的游戏物体是否旋转,一般是不旋转我们用Quaternion.identity表示无旋转

    代码截图如下:

    代码中比较关键的一句:

    public GameOject  m_prefab;

    因为我们定义的是public类型变量,所以在Inspector面板中我们可以看到一个GameObject类型的变量,点击右侧的小圆点就可以找到我们的Box预制体,然后选中它。

    既然要在场景中生成游戏物体,这句话的意思就是要获得要生成游戏物体Box的引用

    void Start ( )函数中语句解释:

     GameObject.Instantiate(m_prefab, Vector3.up,Quaternion.identity);

    m_prefab:代表要传递的游戏物体

    Vector3.up:代表场景中原点上一米的位置

    Quaternion.identity:表示生成的物体无旋转

    4. 生成游戏物体的效果截图

    场景中出现了一个Box,而且在Hierarchy面板中也有一个Box游戏物体括号里有(Clone),意思是这个Box是从Box预制体上克隆过来的。


    -------我是美丽的分割线---------------------------------------------------------------------------------------------------------

    下面来引申一下,Vector3.up表示在场景中原点上方一米的位置生成一个Box, 假如我们要在任意指定的一个位置生成一个Box呢,再或者在任何一个随机位置生成一个Box呢,下面就看操作吧。

    • 指定位置生成一个Box

    这种情况我们只需要给Vector3类型参数指定一个新的位置参数就可以了

    GameObject.Instantiate(m_prefab, new Vector3(1,2,3),Quaternion.identity);

    new Vector3(x,y,z)随意指定参数

    • 随机位置生成一个Box

    随机位置用Random.Rang(min,max)函数成成随机的x,y,z值就可以了

    首先获得min和max的值:在场景中新建一个cube,拖拽cube测量场景长宽的min和max

    可以看到x轴左边,x值为4.5

    x轴右边,x值为-4.5

    所以min为-4.5,max为4.5

    同理可以得到z轴的最大值和最小值

    y轴是上下方向就没有最小最大值的概念了可以任意指定

    代码如下:

    在两米高的地方,x轴z轴上随机生成游戏物体


    -------我是美丽的分割线---------------------------------------------------------------------------------------------------------

    第二部分销毁游戏物体

    创建一个脚本DestoryBox--->添加到预制体Box上

    脚本添加到Box上方法:点中预制体Box--->Inspector面板中,下方Add Component,搜索找到CreatBox脚本组件


    脚本中代码:


    代码解释:

    GameObject.Destroy(gameObject,2.0f);

    Destory是静态方法,用类名加点的形式调用

    方法中有两个参数

    gameObject表示要销毁的游戏对象自身

    2.0f表示2秒后销毁,可以任意指定时间

    也可以用随机数函数生成随机的销毁时间,例如:Random.Range(1.0f,5.0f),表示1到5秒之间的秒数销毁游戏对象。


    -------我是美丽的分割线---------------------------------------------------------------------------------------------------------

    到这里本次分享就结束了,纯小白操作,一点点的码字确实很辛苦,如果这次分享对看到这一贴的你有帮助,那就点个赞吧,这样也能激励我继续学习下去,分享下去!










    展开全文
  • Unity实现物体的动态生成与删除

    万次阅读 2016-09-01 15:22:58
    当我们用Unity开发游戏的时候,怎么能动态的实现怪物的生成与删除。 get到了一种用for循环的方法来实现 首先定义一下生成需要的值 public GameObject _enemyship;//接收需要加载的物体 public int enemyCount;//...

    当我们用Unity开发游戏的时候,怎么能动态的实现怪物的生成与删除。

    get到了一种用for循环的方法来实现

    首先定义一下生成需要的值

    public GameObject _enemyship;//接收需要加载的物体

    public int enemyCount;//定义生成的个数

    public float WaitTime; //定义一个时间,让怪物在游戏开始一段时间后才开始加载

    public float  NextTime;//生成下一波怪物的时间间隔

    void Start()

    {

    StartCoroutine(spawnWaves());//定义一个协同函数来限制怪物产生的时间

    }

    IEnumerator spawnWaves()

    {

     yield return new WaitForSeconds(WaitTime); //在游戏开始后会在waittime时间后才开始执行

    while(true)

    {

    for(int i=0;i<enemyCount)

    {

    Vector3 shipPosition = new Vector3(Random.Range(-1000, 1000), Random.Range(-1000,1000), Random.Range(-1000, 1000));//设置生成物体的随机坐标
    Quaternion shipRotation = Quaternion.Euler(Random.Range(-180,180), Random.Range(-180, 180), Random.Range(-180, 180));//设置生成物体的随机角度

    Instantiate(_enemyShip, shipPosition, shipRotation);//生成物体

     yield return new WaitForSeconds(spawnTime);//限制生成时间间隔

    }

    }

    }


    这样我们便完成了怪物的动态创建,但是这样的创建时无止境的。所以我们可以在物体的身上创建一个脚本,达到某种条件使他消失

    比如用时间来定义

    public float lifetime;//定义一个消失的时间

    void Start()

    {

    Destroy(gameObject,lifetime);//达到时间自动消除。

    }


    展开全文
  • 初试Unity 3D——实例的创建与销毁

    千次阅读 2016-11-26 23:33:06
    有很多时候,我们有这样的需求,就是在游戏场景中增加一个物体,这样的话以前我们通过拖拽来实现的方法肯定是行不通的,这就要求我们使用代码来实现实例的创建。为了方便温习之前学到的知识,我们来模拟一个情景:当...

    有很多时候,我们有这样的需求,就是在游戏场景中增加一个物体,这样的话以前我们通过拖拽来实现的方法肯定是行不通的,这就要求我们使用代码来实现实例的创建。

    为了方便温习之前学到的知识,我们来模拟一个情景:当我们按下键盘上额C键,游戏会在确定的空间范围内的随机位置出现五个红色正方体,而且,每个立方体创建之后,会在随机的时间之内自动销毁。

    首先来分析一下,这个功能的实现需要几个主体:1、一个控制脚本,监听我们键盘事件,创建实例。2、一个红色正方形物体的预制体。3、自动销毁的脚本,挂载在正方体预制体上。

    控制脚本代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class CreateBosx : MonoBehaviour {
    
        //将全局变量使用public修饰,可以在属性面板查看该属性,将预制体拖进去
        //这也是一种找到游戏物体的方法
        public GameObject cube;
    
        //Quaternion.identity代表无旋转
        //Random.Range()生成随机数
        void Update () {
            if(Input.GetKeyDown(KeyCode.C)){
                for(int i=0;i<5;i++){
                    GameObject.Instantiate (cube,new Vector3(Random.Range(-9.0f,9.0f),Random.Range(1.0f,9.0f),Random.Range(-9.0f,9.0f)),Quaternion.identity);
                }
            }
        }
    }

    立方体创建之后自动销毁的代码:

    void Start(){
        //定时销毁
        GameObject.Destroy(gameObject,Random.Range(3.0f,10.0f));
    }
    展开全文
  • Unity3D 动态实例化Prefab

    万次阅读 2014-11-26 12:07:32
    之前写过一篇“Unity3D NGUI动态创建按钮”不少人按照我文章中介绍的方法来动态创建按钮,文章那种做法并不好。现在写一遍新的文章来教大家用Prefab的方式来动态创建NGUI按钮(也可以是任何GameObject)。 1.首先要...
  • unity3d游戏开发实例教程 附带源码(工程文件)
  • Unity3d 实例化对象

    2019-08-03 20:15:24
    unity3D新手上路 实例化对象出现的bug 当我年轻的在unity3D的C#文件中使用new来创建一个对象的时候。 public class Single : MonoBehaviour { private Single m_single; m_single = new Single(); } ...
  • unity3d常用的脚本实例

    2020-07-15 23:30:34
    一些非常实用的unity3d脚本,经测试全部可用
  • Unity3D 删除场景中的实例对象

    千次阅读 2013-05-17 08:50:02
    文章来自:http://www.easyunity3d.com/unity3d-destroy-gameobject.html 在做项目过程中,经常会遇到一种情况: 场景中有不同种类的实例对象,这些实例可以是不同的3D物体。当我们需要点击其中一个物体...
  • Unity3D官方寻路实例

    热门讨论 2020-07-29 14:18:53
    Unity3D官方寻路实例 NavMesh、NavMeshAgent、OffMeshLink用法 适用版本3.5
  • 5款Unity3D制作的小游戏实例,新手必备
  • Unity3D实例化物体

    千次阅读 2018-06-08 20:53:22
    1.实例化函数Instantite( gameObject , transform.position , transform.rotation ) ;在position位置,朝着rotation方向,生成一个gameObject(Clone);例子:发射子弹,游戏逻辑,在Update()函数里添加代码:void ...
  • Unity3D直接就提供接口能够轻松完成这一些,我开始还以为生成器是用Unity3D的粒子系统Particle System做的,其实不是,本身就有预设和实例化Instantiate帮你轻松完成一起。当然,生成也要遵守Unity3D的基本法则啊...
  • Unity3D实例化物体

    千次阅读 2018-04-08 17:46:57
    一:public GameObject itemPrefab;void Store(){ if (transform.childCount == 0) { GameObject itemGameObject = Instantiate(itemPrefab) as GameObject; itemGameObj...
  • unity3d实例教程:俄罗斯方块 扫雷 贪吃蛇
  • Unity3D Instantiate实例化游戏对象【1】

    千次阅读 2017-10-17 22:28:43
    转自:http://blog.csdn.net/sysujackjiao/article/details/67638813
  • Unity3D-动态实例化按钮的总结

    千次阅读 2014-08-15 10:39:25
    目前,我收集到的动态创建按钮只有2种方式。
  • unity3d引用和实例化对象的方法

    千次阅读 2017-07-13 12:12:14
    利用脚本组件的public变量把prefabs拖入到对象相应脚本组件的public变量中,如下图然后在脚本中写如下代码:public class explosionScript : MonoBehaviour { // our ParticleExamples class being turned into an ...
  • 从崩溃的Unity3D实例恢复您的场景

    千次阅读 2017-12-28 11:28:58
    从崩溃的实例恢复您的场景 您的Unity项目遇到过崩溃嘛?你已经有一段时间没有保存你的场景了吗?不要担心!您仍然可以从临时目录恢复它! Unity3D可能会经常崩溃。Unity API提供了我们开发巨大的自由,但...
  • 用处:一般当场景出现两个及两个以上,或者会出现重复的物体的时候,用实例化比较方便 目标:鼠标点击后,在鼠标点击的位置出现一个小球 涉及到:预制件,Instantiate(预制件,newVector(?,?,?),Quaternion....
1 2 3 4 5 ... 20
收藏数 13,682
精华内容 5,472
关键字:

unity3d如何删除实例