【问题标题】:Unity 2D, Shooting with bow Instantiate problemUnity 2D,用弓射击实例化问题
【发布时间】:2018-10-11 11:46:31
【问题描述】:

大家好,我的射箭脚本有点问题。我的意思是我想在播放动画的最后一帧时射箭。我尝试通过设置一个 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.");
    }
}

箭头控制器.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)
    {

    }
}

我的情况示例:

真/假needReload语句示例:

在右边的 Inspector 你有我的玩家信息,在左边(或底部)Inspector 你有 Missile(Arrow)inspector

【问题讨论】:

  • 你在哪里调用 RangeAttack() ?
  • 是的,如果它是鼠标事件或输入,您需要将其更改为 OnMouseButtonDownOnKeyDown' if you have it in OnMouseButton` 或 OnKeyPress 它会重复调用它,但使用向下或向上事件会每次点击只调用一次
  • @Z3RP - 我在 FixedUpdate() 中调用它
  • 所以你的问题是你想在动画的最后一帧射一个箭头吗?
  • 是的,我想让它完全像那样工作。

标签: c# unity3d


【解决方案1】:

您可以使用Animation Events,例如一个布尔值,即您的射速。

你的代码看起来像这样:

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

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

【讨论】:

    【解决方案2】:

    好吧......几个小时后(我浪费了......)。答案简单得可笑。对于像这样的未来“问题”......事情是在我的脚本函数中创建名为“ProduceArrow()”和(除了我所做的)类似动画事件的东西它在动画选项卡中,当你创建你的动画时间轴时你只是需要调用它单击鼠标右键,然后选择它并选择适当的功能。

    Some feedback - gif

    【讨论】:

      【解决方案3】:

      按照您的代码现在的工作方式,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.");
      }
      

      【讨论】:

      • 不幸的是,当我按下射击按钮时,我的播放器只做了动画。但即使是 Debug.Log 也没有用。我的 RangeAttack() 函数位于 FixedUpdate() 中,我应该将其移至 Update() 吗?
      • 不,它应该保留在 FixedUpdated() 中。当应该调用 Instantiate 时,您能否检查 needReload 布尔值是否正确设置为 false?
      • 它看起来不错,我的意思是它按照它的编码工作,以及我希望如何让它工作。当我单击 V (这是我的射击按钮)时 - 它设置为 True 并且当它达到 0 值时我的计数器将变为 0 再次为 false。我在原始消息中发布了一个 gif,向您展示它是如何工作的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多