Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/40: Рейтинг темы: голосов - 40, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 03.04.2020
Сообщений: 17

Анимация проигрывается 2 раза

06.04.2020, 14:08. Показов 8531. Ответов 7

Студворк — интернет-сервис помощи студентам
Здравствуйте, еще раз обращаюсь потому что я тупой. У меня в 2D платформере есть персонаж и при ударе врагом по персонажу у него срабатывает триггер и срабатывает один раз, и когда триггер срабатывает то у меня работает анимация, а потом анимация переходит в PlayerIdle, либо в PlayerRun но он почему-то начинает возвращаться и анимация начинает проигрываться опять хотя триггер не активирован и начинает опять проигрываться анимация. Я у же пробовал поменять значение на Loop, делал анимацию по дольше но все равно не работает.

Unity Personal 2019.3.7f1

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlayerMove : MonoBehaviour
{
    public float JumpForce;
    public float AttackForce;
    private float gameTime;
    private float timeleft;
    private bool IsGround;
    public bool IsAttack;
    private bool IsTrigerAttack;
    private bool block;
    public Buttons1 button;
    public Buttons1 button1;
    public Buttons1 button2;
    public Buttons1 button3;
    public BoxCollider2D collider2;
    Rigidbody2D rb;
    Animator anim;
    SpriteRenderer sprite; 
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        sprite = GetComponent<SpriteRenderer>();
    }
    private void Update()
    {
        if (!button.IsPressed)
        {if (!button1.IsPressed)
        {if (!button2.IsPressed)
        {if (!button3.IsPressed)
        {if (IsGround)
        {anim.SetInteger("State", 0);
                        }
                    }
                }
            }
        }
        IsGround = GetComponentInChildren<GroundDetect>().IsGround;
        gameTime += 1 * Time.deltaTime;
        if (IsAttack)
        {
            if (gameTime >= 0.5)
            {
                timeleft += 0.5f;
                gameTime = 0;
            }
            if (timeleft == 0.5)
            {
                timeleft = 0;
                IsAttack = false;
            }
            anim.SetInteger("State", 3);
        }
        if (IsTrigerAttack)
        {
            IsTrigerAttack = false;
            if (!block)
                rb.velocity += Vector2.up * AttackForce;
        }
        if (
            anim.
            GetCurrentAnimatorStateInfo(0)
            .IsName("PlayerGetHit")
            )
        {
            block = true;
        } else
        {
            block = false;
        }
    }
 
    public void AndroidMoveRight()
    {
        if (!IsAttack)
        {
            if (!block)
            {
                //rb.MovePosition(transform.position + new Vector3(0.05f, 0));
                rb.velocity = new Vector2(1 * 2, rb.velocity.y);
                sprite.flipX = false;
                var collider = GetComponent<BoxCollider2D>();
                collider.offset = new Vector3(0.04224008f, 0.00355899f);
                collider2.offset = new Vector3(-0.3769558f, -1.011807f);
                if (IsGround)
                    anim.SetInteger("State", 1);
            }
        }
    }
    public void AndroidMoveLeft()
    {
        if (!IsAttack)
        {
            if (!block)
            {
                //rb.MovePosition(transform.position + new Vector3(-0.05f,0));
                var collider = GetComponent<BoxCollider2D>();
                collider.offset = new Vector3(-0.04f, 0.00355899f);
                collider2.offset = new Vector3(-0.81f, -1.011807f);
                rb.velocity = new Vector2(1 * -2, rb.velocity.y);
                sprite.flipX = true;
                if (IsGround)
                    anim.SetInteger("State", 1);
            }
        }
    }
    public void AndroidJump()
    {
        if (IsGround == true)
        {
            if (!IsAttack)
            {
                if (!block)
                {
                    //rb.AddForceAtPosition(new Vector2(0, JumpForce), new Vector2(0, JumpForce));
                    rb.velocity += Vector2.up * JumpForce;
                    anim.SetInteger("State", 2);
                }
            }
        }
    }
    public void AndroidAttack ()
    {
        IsAttack = true;
        IsTrigerAttack = true;
    }
    public void GetHit ()
    {
        anim.SetTrigger("GetHit");
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2020, 14:08
Ответы с готовыми решениями:

Не проигрывается анимация
Доброго времени суток! Добавил на объект Animation, кинул 2 анимации и написал в скрипте if (B){ ...

Проигрывается ли анимация?
Как легче всего узнать, что проигрывается такая-то анимация или AnimationState, чтобы, например, блокировать кнопку, пока она не закончится...

Проверить, проигрывается ли анимация
Друзья, есть такой код: using UnityEngine; using System.Collections; public class MovementSimple : MonoBehaviour { ...

7
 Аватар для MrFelix
75 / 53 / 25
Регистрация: 08.03.2020
Сообщений: 243
06.04.2020, 15:27
По тому, что пока у тебя Update добьёт gameTime до 0.5 часть кода, которая ниже вызовется с десяток раз, включение анимации у тебя внутри if (IsAttack) она и воспроизводится.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (IsAttack)
        {
            if (gameTime >= 0.5)
            {
                timeleft += 0.5f;
                gameTime = 0;
            }
            if (timeleft == 0.5)
            {
                timeleft = 0;
                IsAttack = false;
            }
            anim.SetInteger("State", 3);
Debug.Log("Тест");
 
        }
Добавь Debug.Log("Тест"); после включения анимации и в консоли увидишь, что Тест у тебя вылетит раз 10, а то и больше

Чтобы исправить перенеси включение анимации во второй if и будет тебе счастье.
C#
1
2
3
4
5
6
 if (timeleft == 0.5)
            {
                timeleft = 0;
                IsAttack = false;
                anim.SetInteger("State", 3);   
            }
1
0 / 0 / 0
Регистрация: 03.04.2020
Сообщений: 17
06.04.2020, 15:44  [ТС]
Поясняю, IsAttack это когда персонаж сам делает удар, а не когда враг ударил его
0
 Аватар для MrFelix
75 / 53 / 25
Регистрация: 08.03.2020
Сообщений: 243
06.04.2020, 16:01
Ок, тогда какой State = анимации получения урона?
И собственно рецепт всё равно тот же Debug.Log("Тест"); выше переключения анимации и смотрим сколько раз вызывается метод по факту.
Если тест вылетит один раз при получении урона, значит что-то не так с самой анимацией.
1
0 / 0 / 0
Регистрация: 03.04.2020
Сообщений: 17
06.04.2020, 16:11  [ТС]
Я использую отдельный триггер IsAttack... То есть у меня есть переменная когда сам игрок атакует, а есть триггер когда его атаковали. И да у меня огромное количество вывелось "Test".
0
 Аватар для MrFelix
75 / 53 / 25
Регистрация: 08.03.2020
Сообщений: 243
06.04.2020, 16:40
Отсюда вывод, что триггер работает не так как ожидалось, тут несколько вариантов.

1. Разбираемся с триггером, возможно не так настроен
2. Делаем bool, который не будет позволять 2 раза запускаться анимации, но тут нужно будет ещё прописать, когда его включать, а когда выключать.
3. Для определения удара юзаем Scripting API: Collider.OnCollisionEnter(Collision) или что-то в этом роде.
1
0 / 0 / 0
Регистрация: 03.04.2020
Сообщений: 17
07.04.2020, 07:48  [ТС]
Попробовал через Bool и не заработало, теперь анимация вообще н проигрывается.
0
 Аватар для MrFelix
75 / 53 / 25
Регистрация: 08.03.2020
Сообщений: 243
07.04.2020, 08:56
Лучший ответ Сообщение было отмечено ArkadiiLite как решение

Решение

Значит делай либо таймер, чтобы в течении какого-то времени анимация не воспроизводилась, или правильный вариант переделывай атаки через Collider.OnCollisionEnter(Collision)

Добавлено через 8 минут
https://www.youtube.com/watch?v=Xamh-TaeXiY вот посмотри видео и поймёшь как делать

Добавлено через 4 минуты
Вот ещё нашёл https://docs.unity3d.com/Scrip... ter2D.html скорее всего твой вариант
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2020, 08:56
Помогаю со студенческими работами здесь

Почему по триггеру анимация проигрывается дважды?
пользуюсь стандартным нехитрым решением - срабатывание анимации по триггеру if (Input.GetKey(KeyCode.Mouse0)) ...

Проверить проигрывается ли анимация с заданным названием
Как сделать условие, если проигрывается анимация с таким-то названием то тогда... ? Заранее спасибо!

Как определить проигрывается ли сейчас нужная анимация
Был у меня обычный персонаж и запускал я анимации через &quot;anim.Play(&quot;Mine&quot;);&quot; (анимация длится 2,1 секунды) и персонаж начинал рыть ресурс,...

Как проверить проигрывается ли анимация в аниматоре и какая именно ?
Как проверить проигрывается ли анимация в аниматоре и какая именно ? в просто клипе анимации можно проверить isPlaying. или что то типа...

Как исправить баг, когда при зажатом пробеле анимация не проигрывается, а при опускании на землю начинает работать?
using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using System.Linq; public class Animation :...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru