以下代碼拋出錯誤:
UnityException:不允許從 MonoBehaviour 建構式(或實體欄位初始值設定項)呼叫 Range,而是在 Awake 或 Start 中呼叫它。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Cube : MonoBehaviour
{
public MeshRenderer Renderer;
private float speed = Random.Range(10f, 30f);
void Start()
{
transform.Rotate(speed* Time.deltaTime, 0.0f, 0.0f);
}
void Update()
{
if (Input.GetKeyDown("space"))
{
GetComponent<Renderer>().material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f, 0.5f, 1f);
}
}
}
所以我通過在開始時呼叫 Range 方法來編輯它
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Cube : MonoBehaviour
{
public MeshRenderer Renderer;
void Start()
{
private float speed = Random.Range(10f, 30f);
transform.Rotate(speed* Time.deltaTime, 0.0f, 0.0f);
}
void Update()
{
if (Input.GetKeyDown("space"))
{
GetComponent<Renderer>().material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f, 0.5f, 1f);
}
}
}
但是,我有一大堆的錯誤,如錯誤CS1513,CS1519,CS8124等。
如果這聽起來很愚蠢,我很抱歉,我一直在嘗試通過呼叫 RangeAwake()或在線搜索類似情況來解決此問題,但似乎沒有任何效果。
總結一下:
- 我
Random.Range()在哪里呼叫我的代碼? - 為什么呼叫它會
Start()導致各種語法錯誤,例如} expected當我已經輸入時}?
uj5u.com熱心網友回復:
- 我
Random.Range()在哪里呼叫我的代碼?
正如 Unity 告訴您的那樣,在從MonoBehaviour它派生的類中不能在欄位初始化時完成(這發生在執行建構式之前)。原因很可能主要是因為此實體由底層c 后端物體組件系統創建并UnityEngine.Random從那里或通常從其他執行緒訪問類是不可靠的(請參閱UnityEngine.Random)
→ Unity 已經準確地告訴你該怎么做
呼叫它
Awake或Start代替
你要的事件訊息的方法之一中指定的值Awake,Start等等。
- 為什么呼叫它會
Start()導致各種語法錯誤,例如} expected當我已經輸入時}?
因為方法中的區域變數不能有任何訪問修飾符,而你private有。所以編譯器希望你在使用關鍵字之前先用Starta關閉方法。其余的只是跟進編譯器錯誤。}private
您希望將欄位宣告保留在類級別,然后將其分配給 Start
private float speed;
private void Start ()
{
speed = Random.Range(10f, 30f);
}
那么您也很可能不想只旋轉一次,Start而是將其移入Update以獲得連續旋轉。
private void Update ()
{
transform.Rotate(speed * Time.deltaTime, 0.0f, 0.0f);
...
}
最后(這是一個更一般的旁注)您應該更改欄位型別而不是快取
// Already assign vis the Inspector if possible
public Renderer renderer;
private void Awake ()
{
// Get ONCE as fallback
if(!renderer) renderer = GetComponent<Renderer>();
}
然后重用那個參考
private void Update ()
{
...
// it is also preferred to use KeyCode instead of strings
if (Input.GetKeyDown(KeyCode.Space))
{
renderer.material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f, 0.5f, 1f);
}
}
uj5u.com熱心網友回復:
Unity 在后端運行很奇怪。您需要private float speed;在第一個代碼段中宣告like。然后在啟動/喚醒方法中呼叫speed = Random.Range(10f, 30f);
public class Cube : MonoBehaviour
{
public MeshRenderer Renderer;
private float speed;
void Start()
{
speed = Random.Range(10f, 30f);
transform.Rotate(speed* Time.deltaTime, 0.0f, 0.0f);
}
void Update()
{
if (Input.GetKeyDown("space"))
{GetComponent<Renderer>().material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f, 0.5f, 1f); }
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/369353.html
