Воскресенье, 20 Мая 2018, 14:55

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » скрипт здоровья (помогите разобраться со скриптами)
скрипт здоровья
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 ()
Я просто убрал поиск и сделал назначение объекта в инспекторе) хи

В инспекторе не удобно постоянно что-то менять, в коде гораздо проще, хотя поиск по имени/тегу тоже плохой вариант. хи) :D


Разработка программного обеспечения для ОС 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 ()
Спасибо за помощь, все работает))


Обращайся) За одно и себе воскресили знания. Твори шедевр)) lovegcup
alex9999Дата: Воскресенье, 06 Мая 2018, 19:03 | Сообщение # 17
был не раз
Сейчас нет на сайте
Цитата JoeHorzenDev ()
Твори шедевр))

осталось сделать кнопку блокировки звука и можно публиковать, спасибо всем за помощь!


Unity the best

Сообщение отредактировал alex9999 - Среда, 09 Мая 2018, 20:51
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » скрипт здоровья (помогите разобраться со скриптами)
  • Страница 1 из 1
  • 1
Поиск:

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