Я пытаюсь создать случайный Vector3, но Unity выдает мне эту ошибку: UnityException: Range нельзя вызывать из конструктора MonoBehaviour (или инициализатора поля экземпляра), вместо этого вызывайте его в Awake или Start. Вызывается из MonoBehavior 'particleMover'. Это мой код:
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using UnityEngine;
public class particleMover : MonoBehaviour
{
public float moveSpeed;
public float temperature;
public Rigidbody rb;
public Transform tf;
static private float[] directions;
// Start is called before the first frame
void Start()
{
System.Random rnd = new System.Random();
float[] directions = { rnd.Next(1, 360), rnd.Next(1, 360), rnd.Next(1, 360) };
}
// Update is called once per frame
void Update()
{
Vector3 direction = new Vector3(directions[0], directions[1], directions[2]);
direction = moveSpeed * direction;
rb.MovePosition(rb.position + direction);
}
}
Vector3 direction = Random.insideUnitSphere;
И вы использовали (1, 360), и кажется, что вы путаете направление с вращением.
Vector3(x, y, z) - x, y, z являются значениями положения, а не углами.
Кроме того, вам нужно использовать Time.deltaTime
direction = moveSpeed * direction * Time.deltaTime;
Подробнее: https://docs.unity3d.com/ScriptReference/Time-deltaTime.html
Обновленный ответ:
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using UnityEngine;
public class particleMover : MonoBehaviour
{
public float moveSpeed;
public float temperature;
public Rigidbody rb;
public Transform tf;
private Vector3 direction = Vector3.zero;
void Start()
{
direction = Random.insideUnitSphere;
}
void Update()
{
rf.position += direction * moveSpeed * Time.deltaTime;
// If this script is attached to tf object
// transform.position += direction * moveSpeed * Time.deltaTime;
}
}
Направление Vector3 = Vector3.zero; void Start () { направление = Random.insideUnitSphere; } void Update() { rf.position += direction * moveSpeed * Time.deltaTime; }
direction = Random.insideUnitSphere
не обязательно возвращает нормализованный вектор направления. Он находится внутри единичной сферы, а не на ее поверхности. Так что вам лучше сделать direction = Random.insideUnitSphere.normalized;
согласен с тобой. Я только что обновил ответ 👍
первая часть ответа совершенно неверна, @SatoshiNaoki. Я отредактировал его. Не стесняйтесь редактировать, как вы хотите.
также обратите внимание, что неправильно нормализовать единичный вектор (который нормализован)
это не совсем неправильно. нужно только использовать direction.normalized при использовании Random.Range(-1, 1)
Как мне определить при запуске, а затем использовать его в обновлении? (Извините, если это не по теме)