如何在不弄乱虚拟操纵杆的情况下为其他操作添加更多按钮?

时间:2015-02-21 20:18:09

标签: c# unity3d touch drag

我一直试图在没有运气的情况下完成这几个小时。我对Unity3D和C#都很陌生,所以这可能就是我无法让它发挥作用的原因。

我有一个画布,并添加了一个圆形按钮,就像一个操纵杆。在按钮上,在检查器菜单中,我有2个事件触发器,一个用于拖动,一个用于结束拖动。每个人都调用自己独立的函数" StartDrag();"和" EndDrag();"哪个工作得很好,使操纵杆正常工作。

我遇到的问题是,如果我添加一个新按钮,比如说"跳跃"动作,如果我在使用操纵杆时按下它,操纵杆上的按钮不会保持其位置,它会受到新触摸操作的影响。 Bellow你可以看到适用于操纵杆的代码。如何在不弄乱操纵杆的情况下为其他操作添加更多按钮?非常感谢您提前,如果可能的话,请记住我的C#和Unity经验非常有限。

using UnityEngine;
using System.Collections;

public class JoystickMovement : MonoBehaviour {

private Vector3 joystick_center;
public GameObject Player;
public PlayerData playerDataScript;

void Start () {
    joystick_center = transform.position;
}

public void StartDrag(){
    float x = Input.mousePosition.x;
    float y = Input.mousePosition.y;

    Vector3 joyPosition = Vector3.ClampMagnitude(new Vector3 (x-joystick_center.x, y-joystick_center.y, 0), 80) + joystick_center;
    transform.position = joyPosition;
}

public void ResetDrag(){
    transform.position = joystick_center;
    Player.rigidbody.velocity = Vector3.zero;
}

void FixedUpdate () {

    if(playerDataScript.playerStatus == "dead")
    {
        ResetDrag();
    }

    if (playerDataScript.playerStatus == "alive") 
    {
        Player.rigidbody.velocity = Vector3.ClampMagnitude(Player.rigidbody.velocity, 4);
        Player.rigidbody.AddRelativeForce (new Vector3(transform.position.x - joystick_center.x, 0, transform.position.y - joystick_center.y));

    }
}

}

1 个答案:

答案 0 :(得分:0)

我的代码的主要问题是我需要确定需要为操纵杆观察哪些触摸。当我在屏幕上有两个手指时,操纵杆就会变得混乱。为了看看我需要哪种触摸,我只能通过将其x或y坐标与我的操纵杆的原始坐标进行比较来尝试仅使用我的操纵杆周围的触摸。如果他们关闭了,那么我可以让它使用特定的触摸来运行该特定代码。

void Update() 
{
    int i = 0;
    while (i < Input.touchCount)
    {
        if (Input.GetTouch(i).position.x > joystick_center.x - 150 && Input.GetTouch(i).position.x < joystick_center.x + 150)
        {
            if (Input.GetTouch(i).phase != TouchPhase.Ended && Input.GetTouch(i).phase != TouchPhase.Canceled && playerDataScript.playerStatus == "alive")
            {

                //joystick movement code

            } else {
                // reset joystick movement
            }
        }

        ++i;
    }
}