Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение MegaJax 12 дек 2011, 18:07

Я нажимаю F и все жизни убираются хотя как видно из кода должна только одна!
Синтаксис:
Используется csharp
//атака игрока с нанесением урона Enemy
using UnityEngine;
using System.Collections;

public class PlayerAttack : MonoBehaviour {
        // Определение публичных переменных
        public GameObject target;      //Цель игрока
       
        void Start () {
       
        }
       
        // Цикл на каждый кадр
        void Update () {
        //По нажатию клавиши F на клавиатуре происходит атака Enemy
        if(Input.GetKeyUp(KeyCode.F)){
             Attack();
        }
}
         //Атака Enemy
         private void Attack(){
                Debug.Log("Player attacking");
                //У цели Enemy ищем компонент с именем EnemyHealth - скрипт
                EnemyHealth eh = (EnemyHealth)target.GetComponent("EnemyHealth");
                //и используя его метод изменения состояния здоровья
                //(необходимо переписать AddjustCurrentHealth с учетом новых требований)
                eh.AddjustCurrentHealth(-10);
        }      
}      
 

А вот второй код
Синтаксис:
Используется csharp

// Выводит бар, показывающий состояние здоровье



using UnityEngine;

using System.Collections;



public class EnemyHealth : MonoBehaviour {

        //публичные переменые для настроек

        public int maxHealth = 100;

       

        //блок переменных локального пользователя

        private int _curHealth = 100;

       

        private float healthBarLenght;

        //производятся начальные расчеты при создании объекта

        void Start () {

                //задаем начальную ширину бара здоровья

                healthBarLenght = Screen.width /2;

                //Предотврощает ввод неправильного значения

                //максимального здоровья

                if(maxHealth<1) maxHealth=1;

               

        }

       

        void Update () {

                AddjustCurrentHealth(_curHealth);

        }

        void OnGUI () {

            // Выводит сам бар посредством графического интерфейса

            GUI.Box(new Rect(10,40,healthBarLenght,20),_curHealth + "/" + maxHealth);

        }

        // производим расчет нужной ширины бара

        public void AddjustCurrentHealth( int adj){

                _curHealth = adj;

                //блок по предотвращению получению неверного состояния здоровья

                //меньше нуля и больше максимума

                //так как изменяем здоровье из вне

                if(_curHealth < 0) _curHealth =0;

                if(_curHealth > maxHealth) _curHealth = maxHealth;

                //Расчет бара непосредственно

                healthBarLenght = (Screen.width / 2) * (_curHealth / (float)maxHealth);

        }

}

       
 
Последний раз редактировалось MegaJax 12 дек 2011, 20:55, всего редактировалось 4 раз(а).
MegaJax
UNIт
 
Сообщения: 59
Зарегистрирован: 03 дек 2011, 09:23

Re: Почему вместо 10 вычетается все 100 в баре

Сообщение seaman 12 дек 2011, 18:55

Где скрипт EnemyHealth? Мы не экстрасенсы - мало ли что Вы там понаписали.
ЗЫ: Перенесено. Пишите пока в этом форуме - совет во избежание осложнений.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение Rip 12 дек 2011, 21:09

eh.AddjustCurrentHealth(-10);
if(_curHealth < 0) _curHealth =0;

получается : if(-10 < 0) -10 =0; :))
Изображение
Реальность существует независимо от вас, до тех пор пока вы с этим согласны.
Изображение
Аватара пользователя
Rip
UNIт
 
Сообщения: 103
Зарегистрирован: 30 янв 2010, 14:11
Откуда: Оренбугская обл. г.Орск
  • ICQ

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение seaman 12 дек 2011, 22:16

Синтаксис:
Используется csharp
using System;
using UnityEngine;

public class Health : MonoBehaviour
{
   public int maxHealth = 100;

   public int xPosition;
   public int yPosition;

   protected int _curHealth = 100;
   protected float _healthBarLength;
   protected bool _showHelthBar = true;

   public void Start()
   {
       _healthBarLength = Screen.width / 2.0f;
   }

   public void OnGUI()
   {
       if (_showHelthBar && _curHealth != 0) GUI.Box(new Rect(xPosition, yPosition, _healthBarLength, 20), String.Format("{0}/{1}", _curHealth, maxHealth));
   }
   public void AddjustCurrentHealth(int adj)
   {
       _curHealth += adj;
       if (_curHealth < 0) _curHealth = 0;
       if (_curHealth > maxHealth) _curHealth = maxHealth;

       if (_curHealth > 20) _healthBarLength = (Screen.width / 3.0f) * (_curHealth / (float)maxHealth);
       else _healthBarLength = 150;
   }

   public void ShowHealthBar()
   {
       _showHelthBar = true;
   }
   public void HideHealthBar()
   {
       _showHelthBar = false;
   }
}
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение MegaJax 13 дек 2011, 16:43

Всеравно таже ошибка!
MegaJax
UNIт
 
Сообщения: 59
Зарегистрирован: 03 дек 2011, 09:23

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение Golandez 13 дек 2011, 17:06

Синтаксис:
Используется csharp
public void AddjustCurrentHealth(int adj)
   {
       _curHealth += adj;
       adj=0;
       if (_curHealth < 0) _curHealth = 0;
       if (_curHealth > maxHealth) _curHealth = maxHealth;

       if (_curHealth > 20) _healthBarLength = (Screen.width / 3.0f) * (_curHealth / (float)maxHealth);
       else _healthBarLength = 150;
   }

После расчета _curHealth обнуляем adj. Но я бы блокировал всю логику после первого фрейма. Зачем лишние расчеты в Update(), если не наносится дамаг.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение seaman 13 дек 2011, 18:13

Вызывается так:
enemy.AddjustCurrentHealth(-10);
Зачем обнулять adj не понял, если она больше нигде не используется.
Но я бы блокировал всю логику после первого фрейма

Вызов идет по нажатию клавиши на клавиатуре. Какой первый фрейм опять непонятно.
Почему у топикастера не работает - нужно спросить у него, что он там натворил опять.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение Golandez 13 дек 2011, 19:05

Не все досмотрел.
В класс EnemyHealth добавить
Синтаксис:
Используется csharp
void DamageInside(int _damage)
{
 _curHealth+=_damage;
}
 

Вызывать дамаг
Синтаксис:
Используется csharp
eh.DamageInside(-10);

Вместо
Синтаксис:
Используется csharp
eh.AddjustCurrentHealth(-10);

Остальное как в первоисточнике.По сути имеем то же, что и в посте у seaman .
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение seaman 13 дек 2011, 19:23

Совсем не понимаю. Вы предлагаете вовсе не рассчитывать HealthBar? Т.е. просто урезать функциональность? Уж тогда продолжайте - уберите OnGUI - зачем оно без расчета размера healthBarLength. Ну и все остальные функции класса тогда не нужны. Они все завязаны на бар.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение Golandez 13 дек 2011, 19:26

Синтаксис:
Используется csharp
void Update () {
                AddjustCurrentHealth(_curHealth);
        }

Бар учитывается.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение seaman 13 дек 2011, 19:33

О.К. Только тогда в AddjustCurrentHealth нужно убрать первую строчку. Плюс лишние расчеты в Update.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение Golandez 13 дек 2011, 19:44

seaman писал(а): Плюс лишние расчеты в Update.

Все вопросы к ТС.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение MegaJax 13 дек 2011, 20:17

Ну вы молодцы написали)) Вот в чем проблема у меня я запускаю бары полные-нажимаю a они становятся пустыми. А вот другой код Player Atack
Синтаксис:
Используется csharp
//атака игрока с нанесением урона Enemy
using UnityEngine;
using System.Collections;

public class PlayerAttack : MonoBehaviour {
        // Определение публичных переменных
        public GameObject target;      //Цель игрока
        public float coolDown;         //время между атаками
       
        public float attackTimer;         //время проведения атаки
       
        void Start () {
           //Устанавливаем начальное значение
                attackTimer = 0;
                if(coolDown == 0) {
                coolDown = 2.0f;
                }
        }
       
       
        // Цикл на каждый кадр
       
        void Update () {
                //Выдерживаем паузу
                if(attackTimer > 0)
                        attackTimer -= Time.deltaTime;
                //пауза закончена, на всякий случай обнуляем результат
                if(attackTimer < 0)
                        attackTimer = 0;
        //По нажатию клавиши F на клавиатуре происходит атака Enemy
        if(Input.GetKeyUp(KeyCode.F)){
                        //Если пауза выдержина, то наносим удар
                        if(attackTimer == 0){
                 Attack();
                        //устанавливаем размер между паузами ударов
                        attackTimer = coolDown;
            }  
        }
}
         //Атака Enemy
         private void Attack(){
                //вводим переменную distans и вычесляем растояние между объектами
                //и его целью
                float distance = Vector3.Distance(target.transform.position, transform.position);
                //вычесляем еденичный вектор направления к цели
                Vector3 dir = (target.transform.position - transform.position).normalized;
                //вычесляем нахождение цели в поле зрения
                float direction = Vector3.Dot(dir,transform.forward);
                //если дистанция меньше максимальной то можем ударить
                if(distance < 2 && direction > 0) {                                          
                     //У цели Enemy ищем компонент с именем EnemyHealth - скрипт
                     EnemyHealth eh = (EnemyHealth)target.GetComponent("EnemyHealth");
                     //и используя его метод изменения состояния здоровья
                     //(необходимо переписать AddjustCurrentHealth с учетом новых требований)
                     eh.AddjustCurrentHealth(-10);
                }
        }      
}      

 

Ну не хочет и все!
MegaJax
UNIт
 
Сообщения: 59
Зарегистрирован: 03 дек 2011, 09:23

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение seaman 13 дек 2011, 20:22

Вопрос. Почему Вы выдаете информацию порциями? У Вас два скрипта. Изменили - не идет. Выкладывайте оба! Ну откуда мы знаем что Вы добавили во второй скрипт. В первом то изменения видны.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему вместо 10 вычетается все 100 в баре скрипт в нутри!

Сообщение MegaJax 13 дек 2011, 20:27

Ну хорошо)) вот скрипт EnemyHealth
Синтаксис:
Используется csharp
// Выводит бар, показывающий состояние здоровье



using UnityEngine;

using System.Collections;



public class EnemyHealth : MonoBehaviour {

        //публичные переменые для настроек

        public int maxHealth = 100;

       

        //блок переменных локального пользователя

        public int _curHealth = 100;

       

        private float healthBarLenght;

        //производятся начальные расчеты при создании объекта

        void Start () {

                //задаем начальную ширину бара здоровья

                healthBarLenght = Screen.width /2;

                //Предотврощает ввод неправильного значения

                //максимального здоровья

                if(maxHealth<1) maxHealth=1;

                _curHealth = maxHealth;

        }

       

        void Update () {

                AddjustCurrentHealth(_curHealth);

        }

        void OnGUI () {

            // Выводит сам бар посредством графического интерфейса

            GUI.Box(new Rect(10,80,healthBarLenght,20),_curHealth + "/" + maxHealth);

        }

        // производим расчет нужной ширины бара

        public void AddjustCurrentHealth( int adj){

                _curHealth = adj;

                //блок по предотвращению получению неверного состояния здоровья

                //меньше нуля и больше максимума

                //так как изменяем здоровье из вне

                if(_curHealth < 0) _curHealth =0;

                if(_curHealth > maxHealth) _curHealth = maxHealth;

                //Расчет бара непосредственно

                healthBarLenght = (Screen.width / 2) * (_curHealth / (float)maxHealth);

        }

}

       
 
MegaJax
UNIт
 
Сообщения: 59
Зарегистрирован: 03 дек 2011, 09:23

След.

Вернуться в Почемучка

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

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