首页 > 学院 > 开发设计 > 正文

Unity3D 学习教程 13 C# 销毁炮弹

2019-11-17 02:38:01
字体:
来源:转载
供稿:网友

Unity3D 学习教程 13 C# 销毁炮弹

gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的GameObject.Destroy() //表示移除物体或物体上的组件 代表销毁该物体 实际上该物体的内存并没有立即释放 而是在你下下个场景中槽释放内存资源,就是你a场景中Destroy了 一般是在c场景中才真正释放该物体的内存资源(这是我的体会 不知道理解错误没)gameObject.active //是否在场景中停用该物体 在你gameObject.active =false中 则你在场景中用find找不到该物体 //如果该物体有子物体 你要用SetActiveRecursively(false) 来控制是否在场景中停用该物体(递归的)

我们要介绍是销毁物体Destroy()

 1 using UnityEngine; 2 using System.Collections; 3  4 public class acc : MonoBehaviour { 5  6     // Use this for initialization 7     public Transform Q; 8     int speed=50; 9     void Start () {10 11     }12     13     // Update is called once per frame14     void Update () {15         float x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;//左右移动16         float z = Input.GetAxis("Vertical") * Time.deltaTime * speed;//    前后移动17         //主摄像机物体    移动18         transform.Translate(x,0,z);19 20         if(Input.GetKeyDown(KeyCode.Mouse0))21         {22 23             //实列化子弹24             Transform n = Instantiate(Q) as Transform;25             //发射子弹的位置为物体的位置26             n.position = transform.position;27             28             Vector3 f = transform.TransformDirection(Vector3.forward);29             n.gameObject.rigidbody.AddForce(f*3000);30             Destroy(n.gameObject,5);31                                                       //Destroy(n.gameObject);32             //Destroy(gameObject);33         }34 35 36     }37 }

5秒后 销毁物体

Destroy(n.gameObject,5);

立即销毁物体

Destroy(n.gameObject);

如果文件绑定在物体上用

Destroy(gameObject);

来销毁物体

Unity资源内存申请和释放

1.资源类型

GameObject, Transform, Mesh, Texture, Material, Shader, Script和各种其他Assets。

2.资源创建方式

  • 静态引用,在脚本中加一个public GameObject变量,在Inspector面板中拖一个PRefab到该变量上,然后在需要引用的地方Instantiate;
  • Resource.Load,资源需要放在Assets/Resources目录下;
  • AssetBundle.Load, Load之后Instantiate。

    3. 资源销毁方式

  • GameObject.Destroy(gameObject),销毁该物体;
  • AssetBundle.Unload(false),释放AssetBundle文件内存镜像,不销毁Load创建的Assets对象;
  • AssetBundle.Unload(true),释放AssetBundle文件内存镜像同时销毁所有已经Load的Assets内存镜像;
  • Resources.UnloadAsset(Object),释放已加载的Asset对象;
  • Resources.UnloadUnusedAssets,释放所有没有引用的Asset对象。

    4. 生命周期

    实验篇

    实验中创建了一个简单场景,场景中创建了一个Empty GameObject,上面挂了一个脚本,在Awake函数中通过协程函数来创建资源,具体的Coroutine函数下面都有。 实验中创建的Prefab是一个坦克车,加入场景中场景内存增加3M左右,同时创建了一个AssetBundle资源供AssetBundle使用。

    1. Resources.Load方式加载一个Prefab, 然后Instantiate GameObject

    代码如下:
   IEnumerator LoadResources()    {        // 清除干净以免影响测试结果        Resources.UnloadUnusedAssets();        // 等待5秒以看到效果        yield return new WaitForSeconds(5.0f);        // 通过Resources.Load加载一个资源        GameObject tank = Resources.Load("Role/Tank") as GameObject;        yield return new WaitForSeconds(0.5f);        // Instantiate一个资源出来        GameObject tankInst = GameObject.Instantiate(tank, Vector3.zero, Quaternion.identity) as GameObject;        yield return new WaitForSeconds(0.5f);        // Destroy一个资源        GameObject.Destroy(tankInst);        yield return new WaitForSeconds(0.5f);        //释放无用资源        tank = null;        Resources.UnloadUnusedAssets();        yield return new WaitForSeconds(0.5f);    }

执行结果如下:

下面是统计结果:

数据描述MemoryTextureMeshMaterialGameObjectsObjects in SceneTotal Objects
初始72.8M1271/8.0M35/223.0K