[英]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.