欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

unity 切换场景不销毁物体问题的解决

时间:2021-10-21 09:10:55|栏目:.NET代码|点击:

在用unity进行游戏开发时我们有时需要一些物体在场景切换时不需要被销毁这时我们可以用官方给的DontDestroyOnLoad()方法,

这个方法可以让我们在场景切换时不销毁场景。但如果你又返回这个场景(创建不可销毁物体的场景)时就会发现会有两个这个物体(标记为不可销毁的物体)。

这个问题有一个较为简单的解决方法就是:

在物体的Awake()或Star()方法中加入这段代码。如果找到和自己一样的名字却不是自己的物体就将自己销毁,这样就解决了这个问题。(别的地方不知道,我的项目是可以用);

if (GameObject.Find("Players").gameObject != this.gameObject)
            Destroy(this.gameObject);

补充:Unity加载场景、计时器、加载时不销毁某物体

异步加载场景,SceneManager.LoadSceneAsync(SceneName);需引用 using UnityEngine.SceneManagement;命名空间,

Application.LoadLevel这个方法不再适用;

可以用协同程序做一个简单的计时器,详见代码;

DontDestroyOnLoad (this.gameObject);方法可以在加载场景时不销毁指定物体;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Base : MonoBehaviour {    
    public virtual void ScenesLoad(string SceneName,int AfterSomeMinutesToLoad)
    {
       StartCoroutine (Calculagraph(SceneName,AfterSomeMinutesToLoad));
   }
   IEnumerator Calculagraph(string SceneName,int AfterSomeMinutesToLoad)
   {
       yield return new WaitForSeconds (AfterSomeMinutesToLoad*60);
       DontDestroyOnLoad (this.gameObject);
       SceneManager.LoadSceneAsync(SceneName);
   }
}

补充:Unity小技巧――延时销毁GameObject

当我们希望延迟一段时间销毁GameObject,Component,或者 asset 的时候可以利用下面的函数来实现。

不用自己再去实现延迟计时操作。

Destroy(Object obj, float t = 0.0F);

第二个参数单位为秒,物体将在t秒后被销毁。

using UnityEngine;
public class ScriptExample : MonoBehaviour
{
    void DestroyGameObject()
    {
        Destroy(gameObject);
    }
    void DestroyScriptInstance()
    {
        // 立刻从gameobject上移除该脚本
        Destroy(this);
    }
    void DestroyComponent()
    {
        // 从gameobject上移除rigidbody脚本
        Destroy(GetComponent<Rigidbody>());
    }
    void DestroyObjectDelayed()
    {
        // 5秒后销毁当前gameobject
        Destroy(gameObject, 5);
    }
    // 当用户按下Ctr键后,将会从gameobject上移除boxcollider脚本
    void Update()
    {
        if (Input.GetButton("Fire1") && GetComponent<BoxCollider>())
        {
            Destroy(GetComponent<BoxCollider>());
        }
    }
}

在做编辑器扩展开发的时候,非运行时环境,只能使用 Object.DestroyImmediate()

上一篇:ASP.NET.4.5.1+MVC5.0设置系统角色与权限(一)

栏    目:.NET代码

下一篇:C#数组中List, Dictionary的相互转换问题

本文标题:unity 切换场景不销毁物体问题的解决

本文地址:http://www.codeinn.net/misctech/180716.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有