Перейти к содержимому

Как изменять переменные скрипта в игре unity

  • автор:

Variables and the Inspector

When creating a script, you are essentially creating your own new type of component that can be attached to Game Objects just like any other component.

Just like other Components often have properties that are editable in the inspector, you can allow values in your script to be edited from the Inspector too.

using UnityEngine; using System.Collections; public class MainPlayer : MonoBehaviour < public string myName; // Use this for initialization void Start () < Debug.Log("I am alive and my name is " + myName); >> 

This code creates an editable field in the Inspector labelled “My Name”.

Unity создает метку в окне Inspector путем добавления пробела везде, где в имени переменной встречается заглавная буква. Однако это исключительно в целях отображения, и вы должны всегда в коде использовать имя переменной. Если вы отредактируете значение переменной и затем нажмете Play, вы увидите, что сообщение включает введенный вами текст.

In C#, you must declare a variable as public to see it in the Inspector.

Unity позволяет изменять значение переменных скрипта в запущенной игре. Это очень полезно чтобы увидеть эффекты от изменений сразу же, без остановки и перезапуска. Когда проигрывание оканчивается, значения переменных сбрасываются в то состояние, которое они имели до нажатия кнопки Play. Это гарантирует, что вы свободно можете играть с настройками объектов, не боясь что-то испортить.

Как передать значение переменной из одного скрипта в другой?

У меня есть объект с полем скорость (speed). Я хочу, чтобы другие объекты могли использовать её значение, то есть, по факту, иметь доступ к переменной скрипта (по разным причинам это может понадобиться). Как я могу получить доступ к переменной объекта, чтоб все изменения, которые в нем произошли, можно было получить из другого объекта? Вопрос переведен с https://stackoverflow.com/q/13891892/6104996

Отслеживать
Алексей Шиманский
задан 28 июл 2016 в 8:46
Алексей Шиманский Алексей Шиманский
72.1k 12 12 золотых знаков 92 92 серебряных знака 180 180 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Есть несколько способов сделать это.

Если вы хотите получить значение speed из компонента, который прикреплен к объекту с именем, предположим MyObject :

public class SpeedController : MonoBehaviour public float speed; // Для ограничения только на чтение и запретить запись - можно использовать "Свойство" 

то в другом компоненте вы можете сделать следующее:

// Найти объект по имени GameObject go = GameObject.Find("MyObject"); // взять его компонент где лежит скорость SpeedController speedController = go.GetComponent(); // взять переменную скорости float courrentSpeed = speedController.speed; 

Замечание: если нейдется объект с таким именем или их будет много — то это может привести к плачевнм последствием. Также нужно помнить, что операция Find довольно медленная. И, например, в Update лучшее её не использовать. Лучше найти объект при старте и только потом уже использовать.

Самый при самый неудобный способ (да и, в принципе, неправильный, но действующий) — это объявить переменную speed типа SpeedController в каждом классе. Перетащить в это поле объект в эдиторе. Тогда сможете наблюдать за состоянием переменной в любой момент. Но способ ужасный и не рекомендуемый

Еще способ создать синглтон, который будет содержать вашу переменную 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; 

доступ к ней прост:

var speedVal = SpeedController.speed; Debug.Log(speedVal); 

Раз вы пытаетесь сделать так, чтоб она была доступна всем остальным объектам, то, предполагаю, что объект с такой переменной у вас на сцене — один. Иначе этот способ становится бесполезным

Также можно использовать систему сообщений в Unity

Например Component.SendMessage. Он имеет 4 перегруженных метода

public function SendMessage(methodName: string, value: object = null, options: SendMessageOptions = SendMessageOptions.RequireReceiver): void; public function SendMessage(methodName: string, value: object = null, options: SendMessageOptions = SendMessageOptions.RequireReceiver): void; public function SendMessage(methodName: string, value: object = null, options: SendMessageOptions = SendMessageOptions.RequireReceiver): void; public function SendMessage(methodName: string, options: SendMessageOptions): void; 

он вызывает метод с именем methodName в каждом MonoBehaviour на этом объекте, например:

go.SendMessage("GetFallingSpeed"); 

вызовет метод GetFallingSpeed на объекте go . А данный метод (GetFallingSpeed) возможно как раз и будет управлять параметром speed .

Не забудьте, что вам нужно получить доступ к go каким-либо образом, т.е. через Find или другим удобным способом.

Как получить доступ к переменной другого скрипта

Привет начинающим разработчикам! Очень часто нам приходится из одного скрипта обращаться к тем переменным, которые находятся в другом скрипте(компоненте) нашего объекта. В данной статье мы подробно разберёмся, как обращаться к переменной другого скрипта на примере:

  • Обращаемся из скрипта с названием Player.
  • Обращаемся к переменной text, которая находится в скрипте Money.

Первым делом в скрипте Player нам необходимо создать(объявить) переменную с типом, соответствующему названию скрипта, к переменной которого хотите получить доступ. В нашем случае, этот скрипт называется Money. Поэтому новая переменаня должна иметь тип Money. А саму переменную назовём, например, linkMoney:

private Money linkMoney;

Далее в переменную linkMoney присвоим ссылку на скрипт(компонент) Money:

void Start() < linkMoney = GetComponent(); >

Готово! В переменную linkMoney мы записали ссылку на наш скрипт Money, а это значит, что мы теперь имеем доступ ко ВСЕМ публичным переменным и методам скрипта Money. Теперь можно, например, изменить значение переменной text. Давайте сделаем это.

linkMoney.text = "Привет, я изменил значение переменной text в скрипте Money, из скрипта Player.";

Теперь совместим все наши кусочки кодов, и посмотрим как же выглядит ВЕСЬ код скрипта Player.

using UnityEngine; public class Player : MonoBehaviour < private Money linkMoney; void Start() < linkMoney = GetComponent(); linkMoney.text = "Привет, я изменил значение переменной text в скрипте Money, из скрипта Player."; > >

На этом всё. Если у Вас остались какие-либо вопросы, пишите в комментариях. Если нет, то жду Ваших лайков 🙂

Как изменять переменные скрипта в игре unity

Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Новости:
Автор Тема: Unity3d C#script изменение переменной одного скрипта из другого (Прочитано 25875 раз)
0 Пользователей и 1 Гость смотрят эту тему.
HellRoom Games &copy 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines

Страница сгенерирована за 0.174 секунд. Запросов: 29.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *