Подтвердить что ты не робот

В Unity, как я могу передавать значения из одного script в другое?

В Unity я хочу, чтобы у одного объекта была переменная скорости падения, к которой могут обращаться все остальные объекты. По разным причинам я не могу использовать встроенную гравитацию для того, что я пытаюсь сделать.

Как я могу неоднократно обращаться к переменной в одном объекте, так что когда она обновляется, я получаю обновленную переменную из другого объекта?

4b9b3361

Ответ 1

Существует несколько способов достижения этой цели.

Если вам нужна переменная скорости, контролируемая компонентом, который привязан к GameObject MyObject

public class SpeedController : MonoBehaviour
    public float speed;
    // maybe you want restrict this to have read access, then you should use a property instead

В других классах вы можете:

GameObject go = GameObject.Find ("MyObject");
SpeedController speedController = go.GetComponent <SpeedController> ();
float courrentSpeed = speedController.speed;

Позаботьтесь о том, чтобы существовал один объект с именем MyObject, иначе вещи перепутались.

В качестве альтернативы вы можете определить член SpeedController в каждом классе, которому необходим доступ к speed, и установить ссылку путем перетаскивания в редакторе Unity. Вы сохраняете поиск тогда, но, конечно, это довольно неудобно, если это необходимо во многих классах.


Другой способ - создать singleton, который содержит переменную speed и имеет:

public class MyGlobalSpeedController {
    private static MyGlobalSpeedController instance = null;
    public static MyGlobalSpeedController SharedInstance {
        get {
            if (instance == null) {
                instance = new MyGlobalSpeedController ();
            }
            return instance;
        }
    }
    public float speed;
}   

Таким образом, все классы могут получить доступ к этому:

float currentSpeed = MyGlobalSpeedController.SharedInstance.speed

Как сказал Дэн Дворак в разделе комментариев:

public class SpeedController : MonoBehaviour
    public static float speed;

[Обновление] Благодаря Джердаку. Да Component.SendMessage должен быть определенно в списке:

go.SendMessage("GetFallingSpeed");

Снова вам нужно иметь ссылку на go, как описано в первом решении.

Есть еще больше решений этой проблемы. Если вы думаете об игровых объектах, которые активны во всех сценах, вы должны посмотреть на Unity singleton manager classes

Ответ 2

Если бы я был вами, я бы просто сделал эту переменную скорости "статической публикой", чтобы вы могли получить к ней доступ из любого места. Вы всегда должны избегать "find.anything" и т.д. Функций, они довольно медленны. Нет причин для вас искать то, что вы точно знаете, где оно находится.

Ответ 3

other.GetComponent<class name>().object name;