Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
1

Двойной урон

27.09.2018, 18:36. Просмотров 1101. Ответов 12
Метки нет (Все метки)

При попадании, наноситься двойной урон.

Метод ApplyDamage почему-то вызывается два раза.
P.S. Пуля при поподании уничтожается.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEngine;
 
namespace Player
{
    public class EnemyVitals : Vitals
    {
        private void OnEnable()
        {
            Health.OnValueChanged = HealthChanged;
        }
 
        private void HealthChanged()
        {
            Debug.Log("Health is: " + Health.Value);
            if (Health.Value <= 0)
                Destroy(gameObject);
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using UnityEngine;
using UnityEngine.UI;
 
namespace Player
{
    [System.Serializable]
    public struct VitalStat
    {
        public Slider Slider;
        [Range(1.0f, 1000.0f)] public float MaxValue;
 
        private float _value;
        public float Value
        {
            get => _value;
            set
            {
                _value = value;
                OnValueChanged();
            }
        }
 
        public delegate void OnValueChangedCallback();
        public OnValueChangedCallback OnValueChanged;
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using UnityEngine;
 
namespace Player
{
    public class Vitals : MonoBehaviour
    {
        [SerializeField] protected VitalStat Health;
        
        /// <summary>
        /// Called to apply damage.
        /// </summary>
        /// <param name="value">How much to damage.</param>
        public void ApplyDamage(float value)
        {
            Health.Value -= value;
            Debug.Log($"ApplyDamage({value})");
        }
    }
}
C#
1
2
3
4
5
6
var enemyVitals = hit.transform.GetComponentInParent<EnemyVitals>();
if (enemyVitals)
{
    enemyVitals.ApplyDamage(_velocity.z / 10);
    Destroy(gameObject);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2018, 18:36
Ответы с готовыми решениями:

Урон от соприкосновения
Народ помогите пожалуйста!У меня есть переменная int healt = 100,мне нужно при соприкосновении с...

Урон от взрыва гранаты
скрипт для реализации эффекта взрыва public Transform BoomDetonator; public float TimeBoom...

Урон от падения с высоты
Ребята, помогите пожалуйста реализовать урон от падения с высоты. чет не нашел адекватных уроков....

Здоровье врага и урон от пули
Всееем привет. Имеется проблема, когда стреляешь в противника, он не получает урон, что я делаю не...

12
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 485
27.09.2018, 20:22 2
NotGoodEnough, а где он вызывается? Если при вхождении в триггер либо коллайдер то проблема может быть из-за двух вызовов, там нужно будет добавить булевую переменую на проверку.
0
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
27.09.2018, 20:23  [ТС] 3
RostikTawer, При поподании в объект, то есть через Raycast
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 485
27.09.2018, 20:40 4
NotGoodEnough, сначало проверь все варианты ниже:
1) У тебя нигде не висит два скрипта;
2) У тебя это должно вызывать только один кадр;
3) У тебя нигде нет вызова этой функции.
1
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
27.09.2018, 23:15  [ТС] 5
RostikTawer,
1) Висит только один скрипт
2) Вроде бы всё в одном кадре
3) Вызывается только в скрипте Vitals, от которого наследуются PlayerVitals и EnemyVitals
0
Эксперт .NETАвтор FAQ
9495 / 4668 / 1674
Регистрация: 11.01.2015
Сообщений: 5,851
Записей в блоге: 34
28.09.2018, 00:41 6
Цитата Сообщение от NotGoodEnough Посмотреть сообщение
При поподании в объект, то есть через Raycast
Приведите полный код где вызывается raycast.
0
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
28.09.2018, 12:36  [ТС] 7
Storm23, Как раз таки, тот который вы мне давали, с пулей, помните?

Добавлено через 2 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        private void FixedUpdate()
        {
            DrawTrack();
 
            if (_impactType == ImpactType.Destruction || _impactType == ImpactType.Stuck)
                return; //Do not move bullet because it is not active
 
            //Get delta time
            var dt = Time.fixedDeltaTime;
 
            //Add gravity acceleration
            _velocity += Physics.gravity * dt;
 
            //Air drag
            _velocity *= 1 - dt + dt * math.exp(-Drag);
 
            //Next pos
            var nextPos = transform.position + _velocity * dt;
 
            //Check collisions
            if (Physics.Raycast(transform.position, _velocity, out var hit, (nextPos - transform.position).magnitude))
            {
                if (hit.collider != _lastCollider)//to avoid double collision with same collider
                {
                    nextPos = hit.point;
                    
                    var enemyVitals = hit.transform.GetComponentInParent<EnemyVitals>();
                    if (enemyVitals)
                    {
                        enemyVitals.ApplyDamage(_velocity.z / 10);
                        Destroy(gameObject);
                    }
                    
                    CalcImpact(hit);
                    _lastCollider = hit.collider;
                }
            }
 
            //Set position and rotation of bullet
            transform.position = nextPos;
            if (_velocity.sqrMagnitude > 0)
                transform.forward = _velocity;
        }
0
Эксперт .NETАвтор FAQ
9495 / 4668 / 1674
Регистрация: 11.01.2015
Сообщений: 5,851
Записей в блоге: 34
28.09.2018, 13:41 8
Цитата Сообщение от NotGoodEnough Посмотреть сообщение
Как раз таки, тот который вы мне давали, с пулей, помните?
Да, но в моем коде не было никаких Destroy.

Причина двойного попадания скорее всего вот в чем. Вы делаете raycast в FixedUpdate. А затем вызываете Destroy пули.
Но дело в том, что Destroy срабатывает не сразу а срабатывает лишь в следующем фрейме.
А пока Destroy не сработал, в текущем фрейме метод FixedUpdate может сработать несколько раз (потому что это физический фрейм - не совпадает с фреймом отрисовки). Вот и получается, что пуля пробивает несколько раз.
Выход - либо вызывать DestroyImmediate вместо Destroy (но это не рекомендуется), либо сделать bool флажок у пули, который будет показывать, что пуля уничтожена и не нужно больше отрабатывать FixedUpdate:

C#
1
2
3
4
5
6
7
8
9
10
bool isDestroyed;
 
private void FixedUpdate()
{
    if(isDestroyed) return;
    ....
    Destroy(gameObject);
    isDestroyed = true;
    ...
}
1
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
28.09.2018, 14:47  [ТС] 9
Storm23, Я destroy поставил только чтобы посмотреть, почему двойной урон проходит.

Добавлено через 30 минут
Ага, спавнятся 2 пули за выстрел

Добавлено через 3 минуты
Решено: на оружии противника весел скрипт Weapon, которым управляет игрок.
Когда игрок стрелял, оружие противника стреляло и поподало в себя.
0
RostikTawer
28.09.2018, 15:49
  #10

Не по теме:

Цитата Сообщение от NotGoodEnough Посмотреть сообщение
оружие противника стреляло и поподало в себя.
Напомнило мем про BattleField 1

0
Эксперт .NETАвтор FAQ
9495 / 4668 / 1674
Регистрация: 11.01.2015
Сообщений: 5,851
Записей в блоге: 34
28.09.2018, 22:09 11
Лучший ответ Сообщение было отмечено NotGoodEnough как решение

Решение

Цитата Сообщение от NotGoodEnough Посмотреть сообщение
Когда игрок стрелял, оружие противника стреляло и поподало в себя.
На самом деле такая проблема всегда с оружием возникает. Поэтому я либо не ставлю на оружие вообще коллайдер, либо же выношу его на отдельный layer. Аналогичная проблема возникает с выпадающей гильзой, которая постоянно застревает в коллайдерах.

Не по теме:

Цитата Сообщение от RostikTawer Посмотреть сообщение
Напомнило мем про BattleField 1
Какой? Про гранату 100 кг ?
Или про полоски?

0
RostikTawer
29.09.2018, 08:31
  #12

Не по теме:

Цитата Сообщение от Storm23 Посмотреть сообщение
Какой? Про гранату 100 кг ?
Или про полоски?
Да там вообще сплошная игра багов, практически обо всем. Её же тестировали мало.

0
34 / 30 / 8
Регистрация: 22.02.2017
Сообщений: 404
29.09.2018, 16:02  [ТС] 13
Цитата Сообщение от Storm23 Посмотреть сообщение
На самом деле такая проблема всегда с оружием возникает.
Ага.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2018, 16:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Враг не наносит урон по игроку
Привет! Подскажите, в чём проблема? Нужно чтобы враг бил меня, если он подошёл ко мне, а на моём...

Определить средний урон игрока
Помогите пожалуйста решить. Заранее, спасибо. Правила следующие: подбрасывание монетки...

Текстовый бой - как посчитать урон?
У меня есть два числа, hp и damage. Какой код нужно прописать чтобы из hp вычиталось damage, до тех...

Внутренняя ссылка в каждом посте - урон поисковому продвижению?
Здравствуйте. Скажите пожалуйста: Если в конце каждой новости (поста) на своем сайте. Я буду...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.