大家好,我的弓箭射击脚本有点问题。我的意思是,播放动画的最后一帧时,我想射箭。我尝试通过设置一个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)
{
}
}
我的情况示例:
true / false needReload语句示例:
在右边的Inspector中,您有我的玩家信息,在左边(或底部)Inspector中,您有导弹(箭头)检查器
答案 0 :(得分:0)
Okey ...几个小时后(我浪费了...)。答案很简单。对于诸如此类的未来“问题”……事情是在我的脚本函数中创建“ ProduceArrow()”,然后(除了我所做的)在Animation Tab中创建Animation Event之类的东西,当您创建动画时间轴时,需要单击鼠标右键来调用它,然后选择它并选择适当的功能。
答案 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.");
}