【问题标题】:How to trigger scene transition on collision for runtime instantiated object in Unity?如何在 Unity 中为运行时实例化对象触发碰撞场景转换?
【发布时间】:2021-03-06 15:33:50
【问题描述】:

我正在制作一个统一的游戏,用户选择一个角色,然后该角色会生成到游戏世界中。世界由不同的门组成。我想在游戏世界的场景之间添加一个过渡动画(只是一个常规的淡入淡出),但是因为角色是在运行时实例化的,所以我不确定如何将动画师附加到角色上。我还希望动画在玩家与门碰撞时触发。我知道如何创建动画剪辑和动画师,但我需要帮助了解何时以及如何将动画师附加到将在运行时实例化的对象上。 我会在 OnCollisionEnter() 函数中附加动画师吗?如果是这样,我如何通过代码引用该动画师?

这是我在运行时附加到播放器的脚本中的 OnCollisionEnter 代码。 (这很好用)

private void OnCollisionEnter(Collision collision)
    {
        GameObject door = collision.gameObject;
        
        if (door.CompareTag("ExitDoor"))
            SceneManager.LoadScene(0); // spawn back at main lobby
        else if (door.CompareTag("RoomDoor"))
        {
            GameObject Room = door.transform.parent.gameObject;
            if (Room.name.Equals("Room1Door"))
                SceneManager.LoadScene(1); // go to first room
            if (Room.name.Equals("Room2Door"))
                SceneManager.LoadScene(2); // go to second room
            if (Room.name.Equals("Room3Door"))
                SceneManager.LoadScene(3); // go to third room
        }
    }

这是在加载场景时在运行时实例化播放器的脚本(这是在另一个脚本中)

public GameObject InstantiatePlayer()
    {
        characterIndex = PlayerPrefs.GetInt(playerprefkey);
        selectedChar = characters[characterIndex];
        selectedChar.tag = "Player";
        selectedChar.AddComponent<MoveRooms>(); //attaches the script where OnCollisionEnter is
        return Instantiate(selectedChar, spawnPoint.transform.position, spawnPoint.transform.rotation);
    }

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    要获取 Animator ,如果附加了脚本,您可以这样做

    Animator anim;
    
    void Start()
    {
         anim = gameObject.GetComponent<Animator>();
    }
    

    如果它没有附加,你可以尝试这样的事情

    GameObject object;
    Animator anim;
        
        void Start()
        {
             object = GameObject.Find("objectsname");
             anim = object.GetComponent<Animator>();
        }
    

    关于如何使用Animator的更多细节

    https://docs.unity3d.com/ScriptReference/Animator.html

    https://docs.unity3d.com/ScriptReference/Animator.Play.html https://docs.unity3d.com/ScriptReference/Animator.SetTrigger.html

    至于transition,可以尝试使用Caroutines。 Caroutines 是在其他代码继续执行的同时“在一边”执行一段代码。它可以用来“等待”几秒钟(或更长时间)。它非常有用,你可以用它做很多事情。

    一些例子

    public class ExampleClass : MonoBehaviour
    {
        void Start()
        {
    
            // Start function as a coroutine.    
            StartCoroutine(waitForSeconds);
    
        }
    
        private IEnumerator waitForSeconds()
        {
            //do something
            yield return new WaitForSeconds(1f); // the number is in seconds. 
            //do something else
        }
    }
    

    https://docs.unity3d.com/ScriptReference/Coroutine.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2018-02-18
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多