Enemy + Bullet + HealthBar : Проект и урок

Научился сам? Помоги начинающему.

Enemy + Bullet + HealthBar : Проект и урок

Сообщение bomberest 30 ноя 2011, 16:07

http://rghost.ru/32661141
Данный примерчик был написан для reimon245 :) Возможно, другим тоже понадобится. Весьма простой.
Суть: есть враг, в которого мы стреляем шарами. Шар отнимает здоровье у врага. После первого попадания в врага появляется бар его здоровья, далее отображает его.
Скрипт, который вешается на пустой объект с именем Bar и отображает бар здоровья:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class HealthBar : MonoBehaviour {
        //Для показа и скрытия бара
        public bool showBar;
        //Ширина бара
        public float barWidth;
        //Высота бара
        public float barHeight;
        //Хп, которое будет отображаться в баре
        public int health;
        public int healthMax;

        // Use this for initialization
        void Start () {
                //Скрываем бар при старте
                showBar = false;
        }
       
        // Update is called once per frame
        void Update () {
       
        }
       
        void OnGUI()
        {
                //Если бар показывается
                if (showBar)
                {
                        //Создаём строку, которая будет отображаться в 2 вариантах
                        string str;
                        if (health > 0) {str = health+" / "+healthMax;}
                        else {str = "Dead";}
                        //Рисуем бар
                        GUI.Box(
                                new Rect ( Screen.width/2 - barWidth/2, barHeight, barWidth, barHeight),
                                str);
                }
        }
}

Скрипт, который вешается на врага и хранит переменные о его здоровье:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Health : MonoBehaviour {
        //Хп врага
        public int health;
        public int healthMax;

        // Use this for initialization
        void Start () {
                //Хп становится максимальным при старте
                health = healthMax;
        }
       
        // Update is called once per frame
        void Update () {
       
        }
}
 

Скрипт, который вешается на камеру. !!! Камера без Collider. Иначе, добавьте игнорирование коллайдера !!!
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Shoot : MonoBehaviour {
        //Префаб с пулей
        public GameObject bullet;
        //Сила выстрела
        public float force;
        // Use this for initialization
        void Start () {
       
        }
       
        // Update is called once per frame
        void Update () {
                //Если нажимается левая кнопка мыши
                if( Input.GetMouseButtonDown(0) )
                {
                        //Если префаб с пулей указан
                        if (bullet)
                        {
                                //Создаётся объект (объект, точка создания, его ротация)
                                GameObject go = Instantiate(bullet, transform.position, transform.rotation) as GameObject;
                                //Придание объекту ускарение с помощью импульса
                                go.rigidbody.AddForce(transform.forward * force, ForceMode.Impulse );
                        }
                }
        }
}
 

Скрипт, который вешается на пулю:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Bullet : MonoBehaviour {
        //Величина урона
        public int damage;
        //Объект со скриптом бара
        public GameObject barObject;
        public HealthBar healthBarScript;
       
        // Use this for initialization
        void Start () {
                //Находим бар
                barObject = GameObject.Find("Bar");
                //Получаем бар с найденного объекта
                healthBarScript = barObject.GetComponent<HealthBar>();
        }
       
        // Update is called once per frame
        void Update () {
       
        }
       
        void OnCollisionEnter (Collision collision)
        {
                        //Отправляет сообщение в лог с тегом врага
                        Debug.Log(collision.transform.tag);
                //Проверка тега объекта
                if (collision.transform.tag=="Enemy")
                {
                        //Получаем скрипт Health с объекта коллизии
                        Health healthScript = collision.transform.GetComponent<Health>();
                        //Если мы смогли получить оба скрипта
                        if( healthScript && healthBarScript)
                        {
                                //Делаем урон врагу
                                healthScript.health -= damage;
                                //Если хп стало меньше нуля, то ставим 0
                                if (healthScript.health < 0)
                                {
                                        healthScript.health = 0;
                                }
                                //Отправляем в бар инормацию об хп и хп максимальном врага
                                healthBarScript.health = healthScript.health;
                                healthBarScript.healthMax = healthScript.healthMax;
                                //Показывавем бар
                                healthBarScript.showBar = true;
                        }
                        //Если у нас нет скриптов
                        else
                        {
                               
                                Debug.Log("No scripts");
                        }
                }
                //Удаляем объект
                Destroy(gameObject);
        }
}
 
Основы Unity3D Свой 2D-движок Фильм для разработчиков Кастомизация едитора
Лекции игрового программирования
Skype: Andrewf56 | Steam: bomberest (-AnF-) | Vk: _https://vk.com/andrewshut
Аватара пользователя
bomberest
Старожил
 
Сообщения: 538
Зарегистрирован: 22 июн 2011, 14:38
Откуда: Минск
  • ICQ

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение reimon245 30 ноя 2011, 16:09

ООО спасибо огромное) (3A4OT)
reimon245
UNIт
 
Сообщения: 72
Зарегистрирован: 22 ноя 2011, 07:54

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение reimon245 30 ноя 2011, 19:45

Хочу предложить подправить скрипт bomberest,ты не указал как стоит рассчитывать длину бара и проверку на то,если настоящее здоровье больше максимального(мало ли что).
Для этого нужно в скрипт Bar добавить после строчки if(health>0){
Синтаксис:
Используется csharp
if(health>healthMax) ehalth = healthMax;
        barWidth = (Screen.width/2) * (health / (float)healthMax);

Вот и еще когда здоровье врага доходит до 0 нужно убирать бар здоровья вновь командой showHealthBar = false;
И скобку забыл в последнем скрипте после строчки с Destroy еще одну }
Спасибо еще раз за вышеприведенные скрипты) (3A4OT)
reimon245
UNIт
 
Сообщения: 72
Зарегистрирован: 22 ноя 2011, 07:54

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение bomberest 30 ноя 2011, 20:45

reimon245 писал(а):Хочу предложить подправить скрипт bomberest,ты не указал как стоит рассчитывать длину бара и проверку на то,если настоящее здоровье больше максимального(мало ли что).
Для этого нужно в скрипт Bar добавить после строчки if(health>0){
Синтаксис:
Используется csharp
if(health>healthMax) ehalth = healthMax;
        barWidth = (Screen.width/2) * (health / (float)healthMax);

Вот и еще когда здоровье врага доходит до 0 нужно убирать бар здоровья вновь командой showHealthBar = false;
И скобку забыл в последнем скрипте после строчки с Destroy еще одну }
Спасибо еще раз за вышеприведенные скрипты) (3A4OT)

1. Я не собирался его растягивать\уменьшать
2. Превышения здесь быть не может, т.к. регенирации хп нет
Основы Unity3D Свой 2D-движок Фильм для разработчиков Кастомизация едитора
Лекции игрового программирования
Skype: Andrewf56 | Steam: bomberest (-AnF-) | Vk: _https://vk.com/andrewshut
Аватара пользователя
bomberest
Старожил
 
Сообщения: 538
Зарегистрирован: 22 июн 2011, 14:38
Откуда: Минск
  • ICQ

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение reimon245 01 дек 2011, 05:53

:(
reimon245
UNIт
 
Сообщения: 72
Зарегистрирован: 22 ноя 2011, 07:54

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение trololoid 01 дек 2011, 17:22

Вполне возможно, что он имел ввиду читерьё :ymsmug:
Аватара пользователя
trololoid
Старожил
 
Сообщения: 712
Зарегистрирован: 15 сен 2011, 19:18
Откуда: Туапсе, Краснодарский край, Россия

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение Aero7 20 янв 2012, 17:17

а как уничтожать объект, когда у него 0 HP?
Aero7
UNIт
 
Сообщения: 82
Зарегистрирован: 17 окт 2011, 19:04

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение trololoid 20 янв 2012, 17:53

Destroy() (popcorn1)
Аватара пользователя
trololoid
Старожил
 
Сообщения: 712
Зарегистрирован: 15 сен 2011, 19:18
Откуда: Туапсе, Краснодарский край, Россия

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение Aero7 20 янв 2012, 19:24

я пробовал писать так:
если хп = 0
то Дестрой(объект с тегом "enemy")

но тогда пропадают все объекты, а мне надо чтоб тот у кого хп = 0
Aero7
UNIт
 
Сообщения: 82
Зарегистрирован: 17 окт 2011, 19:04

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение seaman 20 янв 2012, 19:37

У какого объекта вы проверяете "если хп = 0"? У всех с тегом enemy? Ведь нет же! Так нафига Вы удаляете все с тегом enemy?!? Удаляйте только тот что надо!
PS^ если hp - переменная скрипта, который где то висит, и Вы просто в этом скрипте проверяете "если хп = 0", тогда Вы не понимаете, что скрипт принадлежит не умозрительной "игре", а какому-то конкретному go. Далее нужно просто понять, что этот самый go содержится в переменной gameObject!!!!
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Enemy + Bullet + HealthBar : Проект и урок

Сообщение explorer 30 июл 2012, 13:55

В скриптах не шарю( Могли бы объяснить, где куда надо вешать скрипт?
сейчас повесил скрипты: Health Bar, healt на объект, по которому я буду стрелять.
А Shoot.cs я повесил на оружие(в данный момент пистолет). И тоже Bullet.cs повесил на оружие - на пулю SpawnPoint
Вот скрины.
У вас нет доступа для просмотра вложений в этом сообщении.
explorer
UNец
 
Сообщения: 1
Зарегистрирован: 30 июл 2012, 13:29


Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2