Вопрос по C# Unity.

14 марта, 14:53 Технологии 4274 1

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

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

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

Как вы можете видеть в коде ниже игрок начинает стрелять когда начинает движение по оси 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;
}
}


}

1 комментарий
Сортировка:
Добавить комментарий
Taras Pavlenko
Taras Pavlenko 2022, 17 апреля, 12:05
0

Для організації пострілів "через певний період" можете спробувати використати корутину, в якій зациклити "постріл - потрібна затримка". Після цього, якщо постріли доступні - запускаєте корутину, якщо недоступні - зупиняєте її.

Більш детальніше про використання корутин: https://docs.unity3d.com/Manual/Coroutines.html


IT Новости

Смотреть все