Получение методов и переменных из других классов
|
|
Omlette | Дата: Воскресенье, 21 Июля 2013, 17:56 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Всем привет! Как же я замучался с этой темой уже: как получить переменную или выполнить метод из других классов (скриптов)? Модификатор static, как я полагал, именно для этого и существует. Я объявлял переменную как static public, далее, из другого уже скрипта, писал имя_класса.имя_переменной.
Вот мои скрипты:
1. Скрипт monster_bar
Код using UnityEngine; using System.Collections; //using System.Linq;
public class monster_bar : MonoBehaviour { //Main script vars public readonly int lv = monster_stats.monster_level; public readonly int hp = monster_stats.monster_hp; public int cur_hp = monster_stats.monster_cur_hp; string target_name; static bool show_bar; //strings public string mclass; public string class_title; //sound public AudioClip click_mob; //Style public GUISkin skin; // Use this for initialization void Start () { cur_hp = hp; } // Update is called once per frame void Update() { if (Input.GetMouseButtonUp(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //получим координаты мышки RaycastHit hit; //Объявим структуру, из которой будем брать данные if (Physics.Raycast(ray, out hit, 65)) //возвращает true если сталкивается с чем либо { Debug.DrawLine(ray.origin, hit.point); //покажем линией на выделяемый объект. if(hit.collider.gameObject.tag == "monster") // Разрешаем помечать объекты только с этим тегом { show_bar = true; target_name = hit.collider.gameObject.name; audio.PlayOneShot(click_mob); } else { show_bar = false; target_name = null; } } } if (Input.GetKeyDown(KeyCode.Escape)) { show_bar = false; target_name = null; } } static public void CheckMonsterRaycast() { if (show_bar == true) { return true; } else { return false; } } void OnGUI() { GUI.skin = skin; if (show_bar) { GUI.Box(new Rect(0.5f * Screen.width, 0.048f * Screen.height, Screen.width * 0.109f, Screen.height * 0.08f), target_name, GUI.skin.GetStyle("monster_bar")); GUI.Label(new Rect(0.503f * Screen.width, 0.077f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), "Health: " + hp + " / " + cur_hp, GUI.skin.GetStyle("hp_ch_status")); GUI.Label(new Rect(0.503f * Screen.width, 0.103f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), class_title + ": " + mclass, GUI.skin.GetStyle("hp_ch_status")); } } }
2. Скрипт testsc Код using UnityEngine; using System.Collections;
public class testsc : MonoBehaviour {
// Use this for initialization void Start () { if (monster_bar.CheckMonsterRaycast()) { print("true"); } else { print ("false"); } } // Update is called once per frame void Update () { } }
На первый взгляд мне кажется это очень легкая задача, но увы ничего не получается. Как мне кажется, метод CheckMonsterRaycast() из первого скрипта проверяет переменную show_bar, когда она только инициализирована, т.е. не видит все действия, которые с ней происходят в методе Update.
Прошу помогите раз и навсегда разобраться с этим делом, на конкретных примерах, чтоб я уже забыл про это. Спасибо откликнувшимся!
Я все смогу! Я все сумею! Переживу! Переболею! Перекантуюсь! Перебьюсь! Но своего таки добьюсь! Не упаду! Не утону! Из грязи вырвусь! Я смогу! И вновь улыбка засияет! Я все смогу! Я все сумею! Я не боюсь! Я не жалею!
|
|
| |
pixeye | Дата: Воскресенье, 21 Июля 2013, 18:04 | Сообщение # 2 |
Red Winter Software
Сейчас нет на сайте
| Ох.
Для начала можно сделать грубый синглетон. Синглетон поможет тебе обращаться к другим классам:
Код public class Monster: Monobehaviour {
public static monster Instance; public bool show_bar;
void Awake(){ Instance = this; }
}
Теперь ты можешь обратиться так: Monster.Instance.show_bar из любого скрипта и места.
Этот вариант в целом удобен для обращений к классам-одиночкам и всякого рода контроллерам.
ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
|
|
| |
pixeye | Дата: Воскресенье, 21 Июля 2013, 18:09 | Сообщение # 3 |
Red Winter Software
Сейчас нет на сайте
| Цитата (Omlette) if (monster_bar.CheckMonsterRaycast())
Так ты не можешь обратиться к другому классу. Дело в том, что monster_bar - это класс, а тебе нужно обратиться к экземпляру класса. Тебе нужно создать переменную.
monster_bar myMonsterBarClass; Как пример в testsc;
В Awake ты должен присвоить экземпляр monster_bar в myMonsterBarClass.
Например так: myMonsterBarClass = GameObject.Find("bar").GetComponent< monster_bar>(); //Очень грубо.
Дальше обращаться так: myMonsterBarClass. show_bar = blabla
ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
|
|
| |
Kira | Дата: Воскресенье, 21 Июля 2013, 18:35 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| void Start () выполниться раньше, чем update().
Добавлено (21.07.2013, 18:35) --------------------------------------------- GameObject go= GameObject.Find("Cube"); Сначала получаешь ссылку го, на котором скрипт. monster_bar t=go.GetComponent< monster_bar>();получаешь ссылку на скрипт Debug.Log(t.CheckMonsterRaycast());// теперь через t получаешь все паблики monster_bar. в данном случае статик не обязателен(даже не нужно, не для этих целей он).
Unity3d разработчик на С#. Лучшее спасибо + в репу. "Безумие: делать одно и то же снова и снова, и ждать при этом разных результатов". "Человек, который никогда не ошибался никогда не пробовал ничего нового". "Если человек может спокойно управлять автомобилем во время поцелуя красивой девушки, значит он уделяет поцелую недостаточно внимания”. Альберт Эйнштейн
Сообщение отредактировал Kira - Воскресенье, 21 Июля 2013, 19:31 |
|
| |
Левша | Дата: Воскресенье, 21 Июля 2013, 19:11 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| Код var damage : float = 5f; var plrScr : Player;
function Start () { if (!plrScr) plrScr = gameObject.Find("Player").GetComponent(Player); } function Update () { plrScr.Damage(damage); // вызываем метод в скрипте Player с аргументом // или plrScr.health -= damage; // прямо отнимаем хп, например при атаке }
X.cor.R (Prologue)
Сообщение отредактировал Левша - Воскресенье, 21 Июля 2013, 19:14 |
|
| |
Omlette | Дата: Воскресенье, 21 Июля 2013, 19:38 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| Спасибо вам, все уяснил и понял! Какой же я пустоголовый)
Я все смогу! Я все сумею! Переживу! Переболею! Перекантуюсь! Перебьюсь! Но своего таки добьюсь! Не упаду! Не утону! Из грязи вырвусь! Я смогу! И вновь улыбка засияет! Я все смогу! Я все сумею! Я не боюсь! Я не жалею!
|
|
| |
pixeye | Дата: Воскресенье, 21 Июля 2013, 19:41 | Сообщение # 7 |
Red Winter Software
Сейчас нет на сайте
| Цитата (Kira) pixeye, аватарку сменил, Нэда Старка напоминает.
winter is coming
ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
|
|
| |