繁体   English   中英

引用 Unity 中的脚本

[英]Reference to a script in Unity

这是一个非常愚蠢的问题,但我一直试图通过创建对象来引用 DisableMovement 方法,为什么玩家在可以移动之后继续移动是错误的? (玩家触地)

// 使用 UnityEngine 的 PlayerController 脚本;

public class PlayerController : MonoBehaviour
{
    
     bool canMove;
    // Start is called before the first frame update
    void Start()
    {
        canMove = true;
        
    }

    // Update is called once per frame
    void Update()
    {
        if (canMove)
        {
            RotatePlayer();
            BoostUp();
        }
    }

    private void BoostUp()
    {
        
    }

    private void RotatePlayer()
    {
        
    }
    public void DisableMovement()
    {
        canMove = false;
    }
}

// 崩溃检测器脚本

using UnityEngine;
using UnityEngine.SceneManagement;

public class CrashDetector : MonoBehaviour
{
    
    PlayerController playerController = new PlayerController();

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Ground")
        {
           
            playerController.DisableMovement();
            Invoke("ReloadScene", FinishLine.DelayTime - 3);
        }
    }
    void ReloadScene()
    {

        SceneManager.LoadScene("Level 1");
    }
}

最后,在 Unity 脚本中创建 OOP 对象的目的是什么? 我看到我们可以通过 get 组件访问脚本,但是还有其他解决方案可以通过创建对象或使用 static 关键字来访问它吗? 什么时候使用静态关键字?

PlayerController playerController = new PlayerController();

是不允许的,也没有任何意义。

您不想创建PlayerController的新实例 - Unity 也不允许这样做:在MonoBehaviour上使用new将打印警告并导致意外行为!

您宁愿做的是获取对现有实例的引用,例如在 Inspector 中公开一个字段

public PlayerController playerController;

或者

[SerializeField] private PlayerController playerController;

并通过拖放引用您现有的组件。

或者通过例如替代地进入运行时

private PlayerController playerController;

private void Awake()
{
    // if it is attached to the same object
    playerController = GetComponent<PlayerController>();

    // if it is somewhere higher in the hierarchy
    playerController = GetComponentInParent<PlayerController>();

    // if it is somewhere lower in the hierarchy
    playerController = GetComponentInChildren<PlayerController>();

    // if there is only one but anywhere in the scene
    playerController = FindObjectOfType<PlayerController>();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM