Unity 2D,弓箭射击实例化问题

时间:2018-10-11 11:46:31

标签: c# unity3d

大家好,我的弓箭射击脚本有点问题。我的意思是,播放动画的最后一帧时,我想射箭。我尝试通过设置一个FirePoint GameObject来做到这一点,并通过在所需帧中的“动画”选项卡中进行录制来放置它。它当然是禁用的,但是在播放动画时启用,然后再次禁用。所以问题是: -当我按与我的射击输入匹配的按钮时,动画播放, -我的实例化出现,并产生多个箭头, -停用后,它会停止产生箭头。

我只想产生一个箭头。有人可以帮忙吗?


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.");
    }
}

箭头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

true / false needReload语句示例:

Example of true/false needReload statement

在右边的Inspector中,您有我的玩家信息,在左边(或底部)Inspector中,您有导弹(箭头)检查器

3 个答案:

答案 0 :(得分:0)

Okey ...几个小时后(我浪费了...)。答案很简单。对于诸如此类的未来“问题”……事情是在我的脚本函数中创建“ ProduceArrow()”,然后(除了我所做的)在Animation Tab中创建Animation Event之类的东西,当您创建动画时间轴时,需要单击鼠标右键来调用它,然后选择它并选择适当的功能。

Some feedback - gif

答案 1 :(得分:0)

您可以使用Animation Events,例如使用布尔值作为您的发射率。

您的代码可能看起来像这样:

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

但是我不知道这是否是计算射速的最佳解决方案。如果有人知道更好的话,请编辑我的遮阳篷:)

答案 2 :(得分:-1)

现在您的代码工作方式,每帧都会调用Instatiate。因此,一键单击(可能长于一帧)将触发多个箭头,因此您需要为何时调用实例化设置条件。您已经计算出重新加载时间,而这正是您所需要的。您只需要将它包括在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.");
}