Как я могу включить стрельбу только тогда, когда NPC находится в прицельной анимации? - PullRequest
1 голос
/ 20 апреля 2019

У меня есть Аниматор.Сначала NPC начинают ходить, затем он медленно останавливается и целится.Затем с помощью сценария я сделал это, когда я нажму левую кнопку мыши, он будет стрелять.Это последнее состояние съемки в Аниматоре.Между состоянием ходьбы и состоянием прицеливания я добавил параметр и установил для него значение true при переходе:

Animator

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shooting : MonoBehaviour
{
    [SerializeField]
    private Transform[] firePoints;
    [SerializeField]
    private Rigidbody projectilePrefab;
    [SerializeField]
    private float launchForce = 700f;
    [SerializeField]
    private Animator anim;
    [SerializeField]
    private bool automaticFire = false;
    [SerializeField]
    private bool slowDownEffect = false;

    private void Start()
    {
        anim.SetBool("Shooting", true);
    }

    public void Update()
    {
        if (Input.GetButtonDown("Fire1") && automaticFire == false)
        {
            if (anim.GetBool("Shooting") == true)
            {
                anim.Play("SHOOTING");
                LaunchProjectile();
            }
        }
        else
        {
            if (automaticFire == true)
            {
                anim.Play("SHOOTING");
                LaunchProjectile();
            }
        }
    }

    private void LaunchProjectile()
    {
        foreach (var firePoint in firePoints)
        {
            Rigidbody projectileInstance = Instantiate(
                projectilePrefab,
                firePoint.position,
                firePoint.rotation);

            projectileInstance.AddForce(new Vector3(0, 0, 1) * launchForce);

            projectileInstance.gameObject.AddComponent<BulletDestruction>().Init();
        }
    }
}

Проблема заключается в том, что язапускаю игру, если я нажму левую кнопку мыши «Fire1», она сразу перейдет / из анимации ходьбы в анимацию стрельбы и начнет стрелять.

Я хочу, чтобы сначала NPC прошел.затем он изменится на прицеливание, когда он закончит переходить на прицеливание только тогда, чтобы иметь возможность стрелять «Огнем1».

Если NPC все еще идет или находится в середине перехода к прицеливанию, не разрешается стрелять.Включение стрельбы должно быть только тогда, когда NPC находится в анимации прицеливания.

1 Ответ

0 голосов
/ 20 апреля 2019
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shooting : MonoBehaviour
{
    [SerializeField]
    private Transform[] firePoints;
    [SerializeField]
    private Rigidbody projectilePrefab;
    [SerializeField]
    private float launchForce = 700f;
    [SerializeField]
    private Animator anim;
    [SerializeField]
    private bool automaticFire = false;
    [SerializeField]
    private bool slowDownEffect = false;

    private void Start()
    {
        anim.SetBool("Shooting", true);
    }

    public void Update()
    {
        if (isAnimationStatePlaying(anim, 0, "AIMING") == true)
        {
            if (Input.GetButtonDown("Fire1") && automaticFire == false)
            {
                if (anim.GetBool("Shooting") == true)
                {
                    anim.Play("SHOOTING");
                    LaunchProjectile();
                }
            }
            else
            {
                if (automaticFire == true)
                {
                    anim.Play("SHOOTING");
                    LaunchProjectile();
                }
            }
        }
    }

    private void LaunchProjectile()
    {
        foreach (var firePoint in firePoints)
        {
            Rigidbody projectileInstance = Instantiate(
                projectilePrefab,
                firePoint.position,
                firePoint.rotation);

            projectileInstance.AddForce(new Vector3(0, 0, 1) * launchForce);

            projectileInstance.gameObject.AddComponent<BulletDestruction>().Init();
        }
    }

    bool isAnimationStatePlaying(Animator anim, int animLayer, string stateName)
    {
        if (anim.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName))
            return true;
        else
            return false;
    }
}

Я добавил метод isAnimationStatePlaying и использовал его в обновлении, и теперь он работает очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...