Пятница, 29 Ноября 2024, 20:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Получение методов и переменных из других классов
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 - игра над которой работаю

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг