![](/img/trans.png)
[英]How do I generate a Random.Range value once, and then use it in void Update to move? Unity, C#
[英]where do i call Random.Range( )
以下代碼引發錯誤:
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);
}
}
}
所以我通過在 start 中調用 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
等。
如果這聽起來很愚蠢,我很抱歉,我一直在嘗試通過在Awake()
中調用 Range 或在線搜索類似情況來解決此問題,但似乎沒有任何效果。
總結一下:
Random.Range()
我的代碼?Start()
中調用它會導致各種語法錯誤,例如我已經輸入 } 時} expected
的}
?
- 我在哪里調用
Random.Range()
我的代碼?
正如 Unity 在從MonoBehaviour
派生的 class 中告訴您的那樣,它不能在字段初始化時完成(在執行構造函數之前發生)。 原因很可能主要是因為這個由底層c++
后端實體組件系統創建的實例並從那里或通常從其他線程訪問UnityEngine.Random
class 是不可靠的(參見UnityEngine.Random
)
→ Unity 已經准確地告訴你該怎么做
改為在
Awake
或Start
中調用它
您必須在事件消息方法Awake
、 Start
等之一中分配值。
- 為什么在
Start()
中調用它會導致各種語法錯誤,例如我已經輸入 } 時} expected
的}
?
因為方法中的局部變量不能有任何訪問修飾符,而你在那里有private
變量。 所以編譯器希望你在使用關鍵字private
之前先用}
關閉Start
方法。 rest 只是跟進編譯器錯誤。
您希望將字段聲明保留在 class 級別,然后在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);
}
}
Unity 在后端工作很奇怪。 您需要聲明private float speed;
就像在第一個片段中一樣。 然后在 start/awake 方法中調用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); }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.