我是 Unity 和 C# 新手。我遇到了一些问题。当我的角色使用“touchmove”移动时,我使用“武器”来启动“projectilePrefab”。 然而,当我实际触摸并移动角色时,我遇到了一个问题,即“projectilePrefab”发射得太快。 帮帮我吧PLZZZZZZZ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Weapon : MonoBehaviour
{
[SerializeField]
private GameObject projectilePrefab;
[SerializeField]
private float attackRate = 0.5f;
public void StartFiring()
{
StartCoroutine("TryAttack");
}
public void StopFiring()
{
StopCoroutine("TryAttack");
}
private IEnumerator TryAttack()
{
while ( true)
{
Instantiate(projectilePrefab, transform.position, Quaternion.identity);
yield return new WaitForSeconds(attackRate);
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TouchMove : MonoBehaviour
{
private Vector3 touchPosition;
private Rigidbody2D rb;
private Vector3 direction;
private float moveSpeed = 10f;
private Weapon weapon;
private void Awake()
{
weapon = GetComponent<Weapon>();
}
private void Start()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
if(Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
touchPosition.z = 0;
direction = (touchPosition - transform.position);
rb.velocity = new Vector2(direction.x, direction.y) * moveSpeed;
weapon.StartFiring();
if (touch.phase == TouchPhase.Ended)
rb.velocity = Vector2.zero;
weapon.StopFiring();
}
}
}
我想确保“projectilePrefab”的发射速度为0.5f,这是我设置的发射速度。
由于它触发得太快,您可能启动了超过 1 个 TryAttack() 协程实例。以下是一些应该有所帮助的事情。
来自文档 - 尝试使用 TouchPhase.Began 开始触发,使用 TouchPhase.Ended 停止。
if (Input.touchCount > 0)
{
touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
// Start Firing
weapon.StartFiring();
}
if (touch.phase == TouchPhase.Ended)
{
// Stop Firing
weapon.StopFiring();
}
}
考虑这样的事情来防止武器启动比预期更多的协程。
public class Weapon : Monobehavior
{
private Coroutine FireRoutine;
public void StartFiring()
{
if (FireRoutine == null)
FireRoutine = StartCoroutine("TryAttack");
}
public void StopFiring()
{
if (FireRoutine != null)
{
StopCoroutine(FireRoutine);
FireRoutine = null;
}
}
}