×

[gamedev] Пауза между выстрелами. Как реализовать?

Здравствуйте друзья! Я начинающий игродел и в процессе изучения столкнулся с вопросом на который не могу найти ответ, точнее ответы нахожу но не могу понять как можно их реализовать в моем случае.

Вопрос следующий:

Как сделать так чтобы выстрел происходил с определенной периодичностью?

Как вы можете видеть в коде ниже игрок начинает стрелять когда начинает движение по оси Z но дело в том что выстрелы происходят беспрерывно. Пробовал реализовать паузу между выстрелами с помощью Invoke но из-за недостатка опыта вероятно просто не правильно это сделал.

Подскажите пожалуйста что мне нужно изменить в коде чтобы выстрелы происходили с определенной периодичностью? Заранее спасибо)

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

public class Ctrl : MonoBehaviour
{
private Animator anim;
public Rigidbody rb;
public GameManager gm;
public float runSpeed = 500f;
public float strafeSpeed = 500f;
public float jumpForce = 50f;
public float invoke_delay = 5000f;
protected bool strafeRun = false;
protected bool strafeLeft = false;
protected bool strafeRight = false;
protected bool doJump = false;
public GameObject Pula;
public GameObject Dulo;
private void Start()
{
anim = GetComponent<Animator>();
}


void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == „Enemy”)
{
gm.EndGame();
Debug.Log("Game Over");
}


}

void Fier()
{
if (transform.position.z > 0f)
{

Vector3 SpawnPoint = Dulo.transform.position;
Quaternion SpawnRoot = Dulo.transform.rotation;
GameObject Pula_For_Fire = Instantiate(Pula, SpawnPoint, SpawnRoot) as GameObject;
Rigidbody Run = Pula_For_Fire.GetComponent<Rigidbody>();
Run.AddForce(Pula_For_Fire.transform.forward * 1000, ForceMode.Impulse);
Destroy(Pula_For_Fire, 5);

}


}

void Update()
{

if (transform.position.z > 0f)
{
anim.SetBool("Shoot", true);
}
//анимация бега
if (transform.position.z > 0f)
{
anim.SetBool("Runing", true);
}

if(Input.GetKey("a"))
{
strafeLeft = true;
}
else
{
strafeLeft = false;
}


if (Input.GetKey("d"))
{
strafeRight = true;
}
else
{
strafeRight = false;
}


if (Input.GetKey("space"))
{
doJump = true;
}


if (transform.position.y < −5f)
{
gm.EndGame();
Debug.Log("Game Over");
}

}

void FixedUpdate()
{
Fier();

//беспрерывный бег
rb.MovePosition(transform.position + Vector3.forward * runSpeed * Time.deltaTime);
if (strafeLeft)
{
rb.MovePosition(transform.position + Vector3.left * runSpeed * Time.deltaTime);
}

if (strafeRight)
{
rb.MovePosition(transform.position + Vector3.right * runSpeed * Time.deltaTime);
}

if (doJump)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);

doJump = false;
}
}


}

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
private bool _isFire = false;

public void Fier() 
{
   float _rechargeTime = 1f; // your time
   If(transform.posizion.z > 0f && (!_isFire)) 
   {
      _isFire = true;
      // Instantiate bullet
      StartCoroutine(Recharge(_rechargeTime))
   }
}

private IEnumerator Recharge(float time) 
{
  yield return new WaitForSeconds(time);
  _isFire = false;
}

сохранить время последнего выстрела (Time.time), и перед выстрелом проверить

Підписатись на коментарі