Попытка создать случайный Vector3 в Unity

Я пытаюсь создать случайный 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);
    }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
5 386
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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;
    }
}

Как мне определить при запуске, а затем использовать его в обновлении? (Извините, если это не по теме)

Spartan2909 10.12.2020 18:20

Направление Vector3 = Vector3.zero; void Start () { направление = Random.insideUnitSphere; } void Update() { rf.position += direction * moveSpeed ​​* Time.deltaTime; }

Satoshi Naoki 10.12.2020 18:27
direction = Random.insideUnitSphere не обязательно возвращает нормализованный вектор направления. Он находится внутри единичной сферы, а не на ее поверхности. Так что вам лучше сделать direction = Random.insideUnitSphere.normalized;
derHugo 11.12.2020 16:29

согласен с тобой. Я только что обновил ответ 👍

Satoshi Naoki 11.12.2020 16:33

первая часть ответа совершенно неверна, @SatoshiNaoki. Я отредактировал его. Не стесняйтесь редактировать, как вы хотите.

Fattie 11.12.2020 16:34

также обратите внимание, что неправильно нормализовать единичный вектор (который нормализован)

Fattie 11.12.2020 16:36

это не совсем неправильно. нужно только использовать direction.normalized при использовании Random.Range(-1, 1)

Satoshi Naoki 11.12.2020 16:36

Другие вопросы по теме