如何解决在移动端 Unity Touch 上运行 Coroutine 的问题

问题描述 投票:0回答:1

我是 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,这是我设置的发射速度。

c# android unity-game-engine mobile
1个回答
0
投票

由于它触发得太快,您可能启动了超过 1 个 TryAttack() 协程实例。以下是一些应该有所帮助的事情。

  1. StopCoroutine("TryAttack") 只会停止它找到的第一个协程。如果您有超过 1 次跑步,它不会停止所有跑步。
  2. StartCoroutine() 不受保护,它有可能启动许多协程,并且由于您没有将它们存储在任何地方,因此它们将更难引用。
  3. 很难确切地说出你想用 Input.touchCount 做什么。 Update() 运行每一帧,因此 Weapon.StartFiring() 运行多次,而 weapson.StopFiring() 仅在触摸端运行一次。 Unity 在文档中提供了一些有用的示例:https://docs.unity3d.com/ScriptReference/Input.GetTouch.html.

来自文档 - 尝试使用 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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.