скрипт здоровья
| |
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 |
|
| |
|