unity3D为什么不能unity销毁物体体?

Unity3D实践系列07,组件的启用或禁用开关,物体的的可见或不可见开关,以及相应事件
时间: 14:18:57
&&&& 阅读:9417
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&& 创建一个Unity项目。 & 在"Project"窗口中,在"Asserts"中,添加"_MyScene"文件夹。 & 点击"File"中的"Save Scene",给Scene命名,并保存到"_MyScene"文件夹。 & 创建一个类型为"Plane"的GameObject,并调整其大小。 & 创建一个类型为"Cube"的GameObject,并适当调整大小。 & 使用脚本控制物体组件的Enable/Disable & 选中"Hierarchy"窗口下的"Cube",如果把其对应的"Inspector"窗口中"Meshe Render"的勾选去掉,将会在"Scene"窗口中看到一个空心的Cube。也就是说,组件可以通过显式的方式被声明为Enable或Disable。 & 还可以通过脚本的方式控制组件的可见性。 & 在"Project"窗口中,在"Asserts"中,添加"_Scripts"文件夹。 & 在"_Scripts"文件夹下创建一个名称为"EnableComponent"的脚本,双击,在Visual Studio中打开并编辑。 &using UnityE
using System.C
public class EnableComponent : MonoBehaviour
public MeshRenderer mM
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
把"EnableComponent"脚本拖动到"Hierarchy"窗口中的"Cube"上,此时在其对应的"Inpector"窗口中的脚本组件中,多了一个"M Mesh"属性。
把"Hierarchy"窗口的"Cube"拖动到"M Mesh"属性值框中,Unity会自动识别Cube上的MeshRenderer,使其成为"M Mesh"的属性值。
现在,我们想当按下键盘上的空格键,让Cube成为空心,即设置Cube脚本组件的"M Mesh"属性值。修改"EnableComponent"脚本如下:
&using UnityE
using System.C
public class EnableComponent : MonoBehaviour
public MeshRenderer mM
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
mMesh.enabled =
保存,并运行游戏。
当按下键盘中的空格键,在"Game"窗口中的Cube自动消失。
如果想通过键盘上的空格键来切换Cube的可见/不可见状态,修改"EnableComponent"脚本如下:
保存,并运行游戏。
当每次按下键盘中的空格键,在"Game"窗口中的Cube要么可见,要么不可见。
使用脚本控制物体的Active/Inactive
再创建一个类型为"Sphere"的球体,适当调整位置和大小。
在"_Scripts"文件夹下创建一个名称为"SetActive"的脚本,双击,在Visual Studio中打开并编辑。
&using UnityE
using System.C
public class SetActive : MonoBehaviour {
// Use this for initialization
void Start () {
//gameObject表示当前物体
gameObject.SetActive(false);
// Update is called once per frame
void Update () {
把"SetActive"脚本拖动到"Hierarchy"窗口的"Sphere"上。
保存,运行游戏,球体不会出现。
当然,物体的可见性最直接的做法是在"Inspector"窗口中显式设置。
OnEnable, OnDisable与OnDestry
这是3个响应事件函数。
OnEnable:当对象变为可用或激活状态时被调调用。OnDisable:当对象变为不可用或非激活状态时被调用。OnDestroy:当MonoBehaviour将被销毁时调用。注意,是脚本被销毁时调用,而不是物体被销毁时被调用。
创建一个名称为"DisableDestroy"的脚本,编写如下:
&using UnityE
using System.C
public class DisableDestroy : MonoBehaviour {
void OnEnable()
Debug.Log("script was enabled");
void OnDisable()
Debug.Log("script was disable");
void OnDestroy()
Debug.Log("script was destroyed");
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
选中"Hierarchy"窗口中"Cube",把原先的脚本组件删除,再把"DisableDestroy"的脚本拖动其上。
保存,运行游戏,在运行过程中,把"Disable Destroy(Script)"的勾选去掉,停止运行,控制台显示如下:
参考资料:极客学院Unity3D课程标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/darrenji/p/4597384.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Unity3D中销毁对象的方式
转载自:http://m.blog.csdn.net/blog/u205461
unity中提供了销毁对象的三种方法:
Destroy方法DestroyImmediate方法DontDestroyOnLoad方法
Destroy方法:
static void Destroy(Object obj, float t = 0.0F);
删除一个游戏物体或组件等。如果Object实际上为组件,则会将其从gameobject中删除并销毁;如果实际上为gameobject则将销毁它的全部组件及其所有子物体~可以指定多长时间后销毁,当然实际上销毁总是存在一定的延迟的,延迟到当前更新循环后和渲染之前。
public class DestroyTest : MonoBehaviour {
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
var collider = gameObject.GetComponent&Collider&();
if (collider)
Debug.Log("collider exists");
Destroy(collider);
}原来运行后
销毁该对象(无子对象情况)~
public class NewBehaviourScript : MonoBehaviour {
void Start () {
var cylinder = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
void Update () {
var cylinder = GameObject.Find("Cylinder");
if (!flag && cylinder)
Debug.Log("cylinder exists~");
Destroy(cylinder);
bool flag =
}并且Hierarchy中不存在Cylinder对象~
销毁该对象及子对象的一切~
var cube = GameObject.Find("Cube");
Debug.Log("cube exists");
Destroy(cube);
}原先:运行后:
DestroyImmediate方法:
static void DestroyImmediate(Object obj, bool allowDestroyingAssets = false);
尽量使用Destroy,该函数在写编辑器代码时使用,延时的销毁永远不会在编辑模式下调用。务必小心的是,该函数会将资源永久销毁,绝不要遍历数组然后依次销毁遍历的元素。其中,allowDestroyingAssets如果设置为TRUE则资源就允许被销毁~
DontDestroyOnLoad方法:
static void DontDestroyOnLoad(Object target);
作用是在加载新场景的时候使目标物体不被自动销毁~
当加载一个新关卡时,所有场景中的所有的物体都会被销毁,然后新关卡中的物体被加载进来,为了保持在加载新关卡时物体不被销毁,使用DontDestroyOnLoad保持,如果物体是一个组件或游戏对象,则所有的Transform层次都不会被销毁,全部保留下来。
还发现了一个现象,就是Object中的静态函数在程序中调用的时候,可以直接调用,不用写类名,当然写了也没有错,其他类的静态函数一定要写类名.函数名()来调用静态函数。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之DontDestroyOnLoad的坑
Unity3D研究院之DontDestroyOnLoad的坑
围观77826次
编辑日期: 字体:
Unity中的一个方法DontDestroyOnLoad可以让某些游戏对象在切换场景的时候不是施放,听起来是一个非常好的方法,但是其实如果没用好那么可能就是有问题了。
举个例子:
在场景1中某一个脚本的Start方法中,DontDestroyOnLoad(A)
接着切换到场景2中,理所当然A对象被保留了下来
如果在从2场景再次回到1场景,那么又执行了一遍DontDestroyOnLoad(A)然而之前你的A对象却没有被施放,这样就会无线循环下去了。
当然我们可以去做逻辑判断是否DontDestroyOnLoad,判断A是否等于Null做一些判断。但是我觉得这其实是下策。DontDestroyOnLoad方法其实更多的是去保存一个全局的游戏脚本,比如一些第三方的SDK你需要用这个脚本来做中间件的支持。
我目前的做法是,我做了一个初始化场景。在初始化场景里面我只做两件事,第一在初始化场景里面的某个游戏对象的全局脚本中,Start方法里我把这个场景里面的所有游戏对象全部设置成DontDestroyOnLoad,也就是切换场景时不销毁,比如NGUI的Root梳妆结构。
Object[] initsObjects = GameObject.FindObjectsOfType(typeof(GameObject));
foreach (Object go in initsObjects) {
DontDestroyOnLoad(go);
第二,接着我在进入我的第一个游戏场景,也就是说我的逻辑永远不会在回返我的初始化场景。所以我也不会出现来回切场景DontDestroyOnLoad没有删除的问题。
还有一个巧妙的办法就是利用static 初始化方法,如下代码所示,当代码在调用Global类的时候
首先程序会进入static Global方法中,这个方法永远只会走一遍,所以我在这里创建一个GameObjcet,然后把Global这条脚本绑定上去,我在DontDestroyOnLoad这个对象。
12345678910111213141516171819202122232425
using UnityEngine;using System.Collections;&public class Global :MonoBehaviour{ public static Global instance;& static Global() {
GameObject go = new GameObject("Globa");
DontDestroyOnLoad(go);
instance = go.AddComponent&Global&(); }& public void DoSomeThings() {
Debug.Log("DoSomeThings"); }& void Start ()
Debug.Log("Start"); }&}
这样这条脚本就类似一个静态脚本了,而且这个游戏对象也永远不会因为切换场景而被销毁。而且用起来非常方便。在需要调用它的地方直接调用就行了。
Global.instance.DoSomeThings();
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity3D关于Destroy不会立即销毁的问题
Destroy(obj);
print(obj);
上面的obj并不会立即销毁,而是需要等待下一个Update更新,所以还是可以被print出来
如果需要立即销毁则应该改为
DestroyImmediate(obj);
print(obj);
很简单的东西,但是却花了一个上午找错,知道与不知道的问题,但是官方文档强烈推荐Destroy,也不知道后者有什么不好的地方。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!unity3d飞机游戏之二 发射子弹及子弹销毁代码 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 13时,
续上次的分享的飞机飞行代码,这次我分享unity3d 飞机发射子弹及子弹销毁代码
游戏DEMO地址 :&
&(19M有点大,请耐心等待)&
Shot.cs(好像拼错英文,shoot才是射击吧,算了)
这个直接拖动到Player上面,其中
&projectilePrefab 是子弹的prefab,你可以自己建立一个子弹的prefab
&shotAudio 是子弹发射的声音,你可以自己拖一个声音
BasicGun.cs 直接拖到你的子弹的prefab里
顺便宣传下我的淘宝店 专卖unity3d插件和教程 & 同时本店现在开启会员9折,购满100减30,购满50减15,购满30减5 的优惠活动哦& &
代码片段(2)
Shot.cs&~&781B&&&&
using UnityE
using System.C
public class Shot : MonoBehaviour
public AudioClip shotA
private AudioSource audioS
public GameObject projectileP
public float fireRate = 0.01f;
private float nextFire = 0.0f;
private bool shooting =
void Start(){
audioSource = GetComponent&AudioSource&();
// Update is called once per frame
void Update ()
if (Input.GetButtonDown ("Fire1"))
shooting =
if (Input.GetButtonUp ("Fire1"))
shooting =
if (shooting && Time.time & nextFire) {
audioSource.PlayOneShot(shotAudio);
GameObject projectile = (GameObject)Instantiate(projectilePrefab,transform.position + transform.forward * -0.8f, Quaternion.identity);
nextFire = Time.time + fireR
BasicGun.cs&~&389B&&&&
using UnityE
using System.C
public class BasicGun : MonoBehaviour
public float damage = 10.0f;
public float speed = 0.5f;
public float DestroyTime = 1.0f;
private Vector3
void Start ()
velocity = -transform.forward *
Destroy (gameObject, DestroyTime);
void FixedUpdate ()
transform.position += velocity * Time.deltaT
开源中国-程序员在线工具:
相关的代码(6)
6回/17241阅
4回/13920阅
10回/10022阅
19回/5259阅
2回/4481阅
4回/3904阅
开源社区,开源or打广告?
2楼:刘汝锋 发表于
3楼:Foou 发表于
这应该是广告吧!
4楼:songo 发表于
开源从代码分享开始
刘汝锋的其它代码

我要回帖

更多关于 unity物体几秒后销毁 的文章

 

随机推荐