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

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

06.04.2020, 14:08. Показов 8494. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru