| 
				
				скрипт здоровья
				 |   |  
| alex9999 | Дата: Воскресенье, 06 Мая 2018, 16:24 | Сообщение # 1 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Здравствуйте, помогите пожалуйста решить проблему: есть скрипт здоровья HealthScript, он висит на главном игроке(playerShip с тегом Player) и на врагах(enemy без тега), в обоих случаях значение hp = 1
 Код  using UnityEngine;
  /// <summary> /// Handle hitpoints and damages /// </summary> public class HealthScript : MonoBehaviour {     /// <summary>     /// Всего хитпоинтов     /// </summary>     public int hp = 1;     public bool dead = false;
      /// <summary>     /// Враг или игрок?     /// </summary>     public bool isEnemy = true;     public Transform explosion;
      /// <summary>     /// Наносим урон и проверяем должен ли объект быть уничтожен     /// </summary>     /// <param name="damageCount"></param>     public void Damage(int damageCount)     {         hp -= damageCount;
          if (hp <= 0)         {             // Срабатывает при уничтожении объекта             if (explosion) ;             {                 GameObject exploder = ((Transform)Instantiate(explosion, this.transform.position, this.transform.rotation)).gameObject;                 Destroy(exploder, 2.0f);                 Destroy(this.gameObject);
                  dead = true;             }                      }              }
  }
 
  и есть скрипт GameController(в котором спавнятся враги и появляется гуи интерфейс при прохождении уровня):
 Код  private void OnGUI()     {
                  if (score >= win)         {                          GUI.Box(new Rect(Screen.width / 2 - 30, Screen.height / 2 - 20, 60, 30), "Win");             if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 + 60, 100, 30), "Menu"))             {                 Application.LoadLevel(0);                             }
                       }
      }
 
  подскажите пожалуйста как мне сделать чтобы при появлении этой кнопки или когда (score >= win), hp главного героя(playerShip с тегом Player) становилось равно 300?
  Unity the best
 
 Сообщение отредактировал alex9999 - Воскресенье, 06 Мая 2018, 16:26  |  
| 
 | 
 |    |  
| JoeHorzenDev | Дата: Воскресенье, 06 Мая 2018, 16:55 | Сообщение # 2 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Ну как то так
 Код  gameObject.CompareTag("Player").GetComponent<HealthScript>().hp=300;
 
  Не помню, нужно ли hp делать статиком, или паблик пойдет) ну ты должен понять соль. Ты же искал как образаться в другой скрипт и менять там значение и именно по тегу(в плеере)) p.s. Это мое 100 сообщение)) Я могу ошибаться, ибо я самоучка и учу код лишь для написание своих ассетов, но должно работать)))
 
 Сообщение отредактировал JoeHorzenDev - Воскресенье, 06 Мая 2018, 17:29  |  
| 
 | 
 |    |  
| zhuravelsv | Дата: Воскресенье, 06 Мая 2018, 17:31 | Сообщение # 3 |  
| 
 почетный гость 
Сейчас нет на сайте 
 
 | Цитата JoeHorzenDev (  )   Не помню, нужно ли hp делать статиком, или паблик пойдет)  static точно не нужен, он делает поле "одним" для всех экземпляров класса, то есть в итоге у всех было бы одно и тоже ХП
  Разработка программного обеспечения для ОС Windows и Android, клиент-серверные, облачные приложения, работа с БД и многое другое - https://www.weblancer.net/users/zhuravelsv/
 |  
| 
 | 
 |    |  
| JoeHorzenDev | Дата: Воскресенье, 06 Мая 2018, 17:46 | Сообщение # 4 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Цитата zhuravelsv (  )   static точно не нужен, он делает поле "одним" для всех экземпляров класса,  Ну вот, и ответ нашелся))
 
 Сообщение отредактировал JoeHorzenDev - Воскресенье, 06 Мая 2018, 17:46  |  
| 
 | 
 |    |  
| alex9999 | Дата: Воскресенье, 06 Мая 2018, 17:55 | Сообщение # 5 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Вот такая ошибка выходит : Assets/scripts/GameController.cs(95,45): error CS1061: Type `bool' does not contain a definition for `GetComponent' and no extension method `GetComponent' of type `bool' could be found. Are you missing an assembly reference?
  вставлял строчку перед
 Код  GUI.Box(new Rect(Screen.width / 2 - 30, Screen.height / 2 - 20, 60, 30), "Win");             if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 + 60, 100, 30), "Menu"))             {                 Application.LoadLevel(0);                             }  и перед последней фигурной скобкой, GetComponent<HealthScript> во всех случаях подсвечивается красным
  Unity the best
 
 Сообщение отредактировал alex9999 - Воскресенье, 06 Мая 2018, 17:56  |  
| 
 | 
 |    |  
| JoeHorzenDev | Дата: Воскресенье, 06 Мая 2018, 18:13 | Сообщение # 6 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Цитата   GUI.Box(new Rect(Screen.width / 2 - 30, Screen.height / 2 - 20, 60, 30), "Win");  if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 + 60, 100, 30), "Menu"))  {  Application.LoadLevel(0);  ВОТ СЮДА ВТЫКАЛ?  }
 
  Вон туды втыкал? Я сейчас сделаю у себя проект и посмотрю)
 |  
| 
 | 
 |    |  
| alex9999 | Дата: Воскресенье, 06 Мая 2018, 18:21 | Сообщение # 7 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Цитата JoeHorzenDev (  )   Вон туды втыкал?   да, все равно та же ошибка, и так делал: 	void Update () {  if (score >= win)  gameObject.CompareTag("Player").GetComponent<HealthScript>().hp = 300;  } все равно такая же ситуация...
  Unity the best
 |  
| 
 | 
 |    |  
| JoeHorzenDev | Дата: Воскресенье, 06 Мая 2018, 18:30 | Сообщение # 8 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Код  //в начале класса     public GameObject Player; // а это там где лоад левел в гуе             {                 Application.LoadLevel(0);                 Player.GetComponent<HealthScript>().hp=300;             }
 
  Сделал в геймконтролере паблик объект плеер, и в инспекторе повесил объект плеера)
 
 Сообщение отредактировал JoeHorzenDev - Воскресенье, 06 Мая 2018, 18:32  |  
| 
 | 
 |    |  
| zhuravelsv | Дата: Воскресенье, 06 Мая 2018, 18:35 | Сообщение # 9 |  
| 
 почетный гость 
Сейчас нет на сайте 
 
 | Цитата alex9999 (  )   gameObject.CompareTag("Player")  этот метод возвращает (bool): true если тег у обьекта == Player, flase - в противоположном случае. И получается что ты к результату определения "равен ли тег ЭТОГО обьекта" пытаешься "применить" метод GetComponent, который есть только в GameObject/MonoBehaviour
  вместо этого используй ПОИСК обьекта по тегу, вот информация: https://docs.unity3d.com/ScriptReference/GameObject.FindWithTag.html
  Разработка программного обеспечения для ОС Windows и Android, клиент-серверные, облачные приложения, работа с БД и многое другое - https://www.weblancer.net/users/zhuravelsv/
 |  
| 
 | 
 |    |  
| JoeHorzenDev | Дата: Воскресенье, 06 Мая 2018, 18:36 | Сообщение # 10 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Цитата zhuravelsv (  )   этот метод возвращает (bool): true если тег у обьекта == Player, flase - в противоположном случае. И получается что ты к результату определения "равен ли тег ЭТОГО обьекта" пытаешься "применить" метод GetComponent, который есть только в GameObject/MonoBehaviour
   Я просто убрал поиск и сделал назначение объекта в инспекторе) хи
 |  
| 
 | 
 |    |  
| drcrack | Дата: Воскресенье, 06 Мая 2018, 18:36 | Сообщение # 11 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Цитата   но должно работать)))   не должно, потому что CompareTag("Player") возвращает bool и у него нет метода GetComponent
 |  
| 
 | 
 |    |  
| JoeHorzenDev | Дата: Воскресенье, 06 Мая 2018, 18:38 | Сообщение # 12 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Код  gameObject.FindWithTag("Player").GetComponent<HealthScript>().hp=300;
 
  Ну вот, можно просто заменить не верный метод. Не заметил что влепил не тот)
 |  
| 
 | 
 |    |  
| zhuravelsv | Дата: Воскресенье, 06 Мая 2018, 18:39 | Сообщение # 13 |  
| 
 почетный гость 
Сейчас нет на сайте 
 
 | Цитата drcrack (  )   Я просто убрал поиск и сделал назначение объекта в инспекторе) хи  В инспекторе не удобно постоянно что-то менять, в коде гораздо проще, хотя поиск по имени/тегу тоже плохой вариант. хи)  
  Разработка программного обеспечения для ОС Windows и Android, клиент-серверные, облачные приложения, работа с БД и многое другое - https://www.weblancer.net/users/zhuravelsv/
 |  
| 
 | 
 |    |  
| alex9999 | Дата: Воскресенье, 06 Мая 2018, 18:42 | Сообщение # 14 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Цитата JoeHorzenDev (  )   Сделал в геймконтролере паблик объект плеер, и в инспекторе повесил объект плеера)   Спасибо за помощь, все работает)) только я эту строчку Player.GetComponent<HealthScript>().hp=300; поставил под вот этим : if (score >= win)  {
  Unity the best
 
 Сообщение отредактировал alex9999 - Воскресенье, 06 Мая 2018, 18:44  |  
| 
 | 
 |    |  
| drcrack | Дата: Воскресенье, 06 Мая 2018, 18:42 | Сообщение # 15 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Код  // Срабатывает при уничтожении объекта if (explosion) ; {
  а вот это кстати че такое вообще, зачем условие с пустым блоком? оно ж не работает) можешь просто удалить
 
 Сообщение отредактировал drcrack - Воскресенье, 06 Мая 2018, 18:43  |  
| 
 | 
 |    |  
| JoeHorzenDev | Дата: Воскресенье, 06 Мая 2018, 18:43 | Сообщение # 16 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Цитата zhuravelsv (  )   В инспекторе не удобно постоянно что-то менять, в коде гораздо проще  Ну хз, я дизайнер. И у меня все основные параметры и дочерние объекты меняются в инспекторе, ибо я там все систематизирую, подписываю и тд. Код всегда пишу в законченном виде, и в него потом не лезу, все делаю в инспекторе)Добавлено (06 Мая 2018, 18:43) ---------------------------------------------
  Цитата alex9999 (  )   Спасибо за помощь, все работает))  
  Обращайся) За одно и себе воскресили знания. Твори шедевр))  
 |  
| 
 | 
 |    |  
| alex9999 | Дата: Воскресенье, 06 Мая 2018, 19:03 | Сообщение # 17 |  
 
был не раз 
Сейчас нет на сайте 
 
 | Цитата JoeHorzenDev (  )   Твори шедевр))  осталось сделать кнопку блокировки звука и можно публиковать, спасибо всем за помощь!
  Unity the best
 
 Сообщение отредактировал alex9999 - Среда, 09 Мая 2018, 20:51  |  
| 
 | 
 |    |     
		
		 
 |