簡體   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