簡體   English   中英

我在哪里調用 Random.Range()

[英]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); 
        }
    }
}

但是,我遇到了一堆錯誤,例如錯誤CS1513CS1519CS8124等。

如果這聽起來很愚蠢,我很抱歉,我一直在嘗試通過在Awake()中調用 Range 或在線搜索類似情況來解決此問題,但似乎沒有任何效果。

總結一下:

  1. 我在哪里調用Random.Range()我的代碼?
  2. 為什么在Start()中調用它會導致各種語法錯誤,例如我已經輸入 } 時} expected}
  1. 我在哪里調用Random.Range()我的代碼?

正如 Unity 在從MonoBehaviour派生的 class 中告訴您的那樣,它不能在字段初始化時完成(在執行構造函數之前發生)。 原因很可能主要是因為這個由底層c++后端實體組件系統創建的實例並從那里或通常從其他線程訪問UnityEngine.Random class 是不可靠的(參見UnityEngine.Random

→ Unity 已經准確地告訴你該怎么做

改為在AwakeStart中調用它

您必須在事件消息方法AwakeStart等之一中分配值。

  1. 為什么在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM