Unity 2D, стрельба из лука Проблема создания экземпляра - PullRequest
0 голосов
/ 11 октября 2018

Привет всем У меня есть небольшая проблема с моим сценарием стрельбы из лука.Я имею в виду, что хочу стрелять, когда играю один из последних кадров из моей анимации.Я пытаюсь сделать это, установив FirePoint GameObject, поместив его, записав его на вкладке «Анимация» в нужном кадре.Конечно, он отключен, но включен при воспроизведении анимации, а затем снова отключен.Итак, проблема в том, что: - когда я нажимаю кнопку, соответствующую моему входу в Shooting, анимация воспроизводится, - появляется My Instantiate, и он выдает несколько стрелок, - когда он отключен, он перестает генерировать стрелки.

Я хочу произвеститолько одна стрелаМожет ли кто-нибудь помочь?


CombatScript.cs:

/*    private bool shootBow;
 *    public bool needReload = false;
 *    public float reloadTime = 1.5f;
 *    public float realoadCD;
 */
public void RangeAttack()
{
    if (needReload == false && gameObject.GetComponent<PlayerControls>().grounded == true && Input.GetButtonDown("Ranged"))
    {
        animator.SetTrigger("shootBow");

        attack1 = false; // Melle attacks sets to false in case of lag or smth.
        attack2 = false;
        attack3 = false;



        needReload = true;

        if (needReload == true)
        {
            reloadCD = reloadTime;
        }
    }

    if (reloadCD > 0 && needReload == true)
    {
        reloadCD -= Time.deltaTime;
    }

    if (reloadCD <= 0)
    {
        reloadCD = 0;
        needReload = false;
    }
    if (firePoint.gameObject.activeSelf == true)
    {
        Instantiate(Missile, new Vector3(firePoint.position.x + 1, firePoint.position.y), firePoint.rotation);
        Debug.Log("It's a bird, a plane, no.. it's arrow.");
    }
}

Arrow Controller.cs:

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

public class ArrowController : MonoBehaviour {

    public float speed;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update ()
    {
        GetComponent<Rigidbody2D>().velocity = new Vector2(speed, GetComponent<Rigidbody2D>().velocity.y);
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Enemy")
        {
            Destroy(collision.gameObject);
        }

        Debug.Log("Arrow Broke");
        Debug.Log(gameObject.name);
        //Destroy(gameObject);
    }

    public void OnCollisionEnter2D(Collision2D collision)
    {

    }
}

Пример моей ситуации:

Example of my situation

Пример истинного / ложного оператора needReload:

Example of true/false needReload statement

в правом Инспекторе у вас есть информация о моем Игроке, в левом (или нижнем) Инспекторе у вас есть Инспектор Ракет (Стрелок)

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Окей ... пару часов спустя (что я потратил впустую ...).Ответ был до смешного легким.Для будущих «проблем», подобных этому ... нужно было создать в моем скрипте функцию «ProduceArrow ()» и (в дополнение к тому, что я сделал) что-то вроде события анимации, это на вкладке «Анимация», когда вы создаете временную шкалу анимации, вы простонужно вызвать его, щелкнув правой кнопкой мыши, а затем выбрать его и выбрать правильную функцию.

Некоторые отзывы - gif

0 голосов
/ 12 октября 2018

Вы можете использовать Анимационные события и, например, логическое значение, которое является вашей скоростью.

И ваш код может выглядеть примерно так:

float LastShoot;
        float FireRate = 10;
        public void OnShoot()
        {
            if (LastShoot <= 0)
            {
                //Shoot your arrow
                LastShoot = FireRate;
            }
        }
        void Update()
        {
            LastShoot -= 0.5f;
        }

Но яНе знаю, если это лучшее решение для расчета скорости огня.Если кто-то знает лучше, не стесняйтесь и отредактируйте мой awnser:)

0 голосов
/ 11 октября 2018

Как работает ваш код прямо сейчас, Instatiate будет вызываться каждый кадр.Таким образом, одно нажатие кнопки, которое, вероятно, длиннее одного кадра, вызовет несколько стрелок, поэтому вам нужно установить условие, когда вы хотите, чтобы Instantiate вызывался.Вы уже рассчитываете время перезагрузки, которое именно то, что вам нужно.Вам просто нужно включить его в свой оператор if следующим образом:

if (firePoint.gameObject.activeSelf == true && !needReload)
{
    Instantiate(Missile, new Vector3(firePoint.position.x + 1, firePoint.position.y), firePoint.rotation);
    Debug.Log("It's a bird, a plane, no.. it's arrow.");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...