c# - 轻按几下如何修复?

标签 c# android ios unity3d touch

我有一个角色轮换,就是基于这个。有一个操纵杆。如果您先将手指放在角色的旋转上,然后再放在操纵杆上 - 一切都很好。但是,如果一开始在操纵杆上,然后尝试转动,什么都不会发生!帮助。几天不能决定

 void Start()
    {
        mContr = GameObject.FindGameObjectWithTag("Joystick").GetComponent<MobileController>();
    }

    void Update()
    {
        if(xp > 0)
        {
            deadStatus = false;
            ch_animator.SetBool("dead", false);
        }
        if(xp <= 0)
        {   if(deadStatus == false)
            {
                menu.gameObject.SetActive(false);
                ch_animator.SetBool("Run", false);
                ch_animator.SetBool("Walk", false);
                ch_animator.SetBool("right", false);
                ch_animator.SetBool("left", false);
                ch_animator.SetBool("dead", true);
                dead.gameObject.SetActive(true);
                if(GameObject.Find("selectLvl"))
                {
                    GameObject.Find("selectLvl").SetActive(false);
                }
                if(GameObject.Find("settings"))
                {
                    GameObject.Find("settings").SetActive(false);
                }
                deadStatus = true;
            }
        }
        if(eat > 10)
        {
            if(xp>0&&xp!=100) {
                xp += Time.deltaTime * 1f;
                eat -= Time.deltaTime * 0.5f;
            }
            speedMove = 3;
        } else {
            speedMove = 1;
            if(eat < 1 ) {
                xp -= Time.deltaTime * 0.06f;
            }
        }
        if(xp.ToString() != hpText.text) {
            hpText.text = Math.Round(xp).ToString();
        }
        if(eat.ToString() != eatText.text)
        {
            eatText.text = Math.Round(eat).ToString();
        }
        if(star.ToString() != starText.text)
        {
            starText.text = star.ToString();
        }
        if(gun.ToString() != gunText.text)
        {
            gunText.text = gun.ToString();
        }
        int k = 1;
        while(Input.touchCount > k)
        {
            Vector2 deltaposition = Vector2.zero;
            if(Input.GetTouch(k).position.x > Screen.width / 2 - 100)
            {
                if(k == 0)
                    deltaposition = Input.GetTouch(k).deltaPosition;
                deltaposition.x /= Screen.dpi;
                if(deltaposition.x != 0)
                {
                    float speedX = 3 * deltaposition.x;
                    player.transform.Rotate(Vector3.up * speedX);
                }
            }
            k++;
        }


        CharacterMove();
        GameGravity();
    }

密码
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class MobileController: MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{
    private Image jostickBG;
    [SerializeField]
    private Image jostick;
    public Vector2 inputVector;
    private void Start()
    {
        jostickBG = GetComponent<Image>();
        jostick = transform.GetChild(0).GetComponent<Image>();
    }

    public virtual void OnPointerDown(PointerEventData ped)
    {

    }
    public virtual void OnPointerUp(PointerEventData ped)
    {
        inputVector = Vector2.zero;
        jostick.rectTransform.anchoredPosition = Vector2.zero;
    }

    public virtual void OnDrag(PointerEventData ped)
    {
        Vector2 pos;
        if(RectTransformUtility.ScreenPointToLocalPointInRectangle(jostickBG.rectTransform, ped.position, ped.pressEventCamera, out pos))
        {
            pos.x = (pos.x / jostickBG.rectTransform.sizeDelta.x);
            pos.y = (pos.y / jostickBG.rectTransform.sizeDelta.y);
            inputVector = new Vector2(pos.x * 2 - 0, pos.y * 2 - 0);
            inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
            jostick.rectTransform.anchoredPosition = new Vector2(inputVector.x * (jostickBG.rectTransform.sizeDelta.x / 2), inputVector.y * (jostickBG.rectTransform.sizeDelta.y / 2));
        }
    }

    public float Horizontal()
    {
        return inputVector.x;
    }

    public float Vertical()
    {
        return inputVector.y;
    }
}

最佳答案

问题来自while循环:

您的逻辑仅适用于旋转玩家的 k=0 和快乐的 k=1,并且您开始以 k=1 的值进入 while 循环,如果该值是旋转玩家的位置,则测试是否始终为假

if(Input.GetTouch(k).position.x > Screen.width / 2 - 100)

我建议你像这样重构你的代码:

当您有 2 次触摸 k=0 和 k=1 时,请为每次触摸找到正确的操作。

我不明白你为什么不进入 k=0 的 while 循环?

关于c# - 轻按几下如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61844761/

相关文章:

ios - 从 XIB 到 Storyboard

c# - 在 using block 调用 Dispose() 内部调用 Response.Redirect() 吗?

c# - 使用 openid 与 ServiceStack 的 WPF 使用者

c# - 使用 Json.NET lib 通过 json 发送 javascript 函数

android: 谷歌地图 8.4.0 版本在某些设备上崩溃

android - 在 ImageView 上添加 TextView (Android)

ios - IOS 中的 Google Place Search API

c# - 如何使其他脚本可以访问变量但不在检查器中覆盖?

android - 使用另一个没有 google play 的 apk 更新已安装的 android apk

ios - 不明白如何本地化iOS react native 应用程序的plist