简体   繁体   English

Unity android ui触摸按钮仅适用于一个对象

[英]Unity android ui touch buttons only works for one object

Hello i am new to Unity. 您好,我是Unity新手。

I have a multiplayer android 2D game made in Unity and I wanted to be able to control the player1 and player2 using UI touch buttons. 我有一个在Unity中制作的多人Android 2D游戏,我希望能够使用UI触摸按钮控制player1和player2。 Now the problem is im only able to control one player that has a child of my canvass(has ui touch buttons) and event trigger. 现在的问题是我只能控制一个拥有我的游说(有ui触摸按钮)和事件触发器的孩子的玩家。 What can i do to control both of my players when using UI touch buttons over Unity matchmaking. 在Unity配对上使用UI触摸按钮时,我可以做些什么来控制我的两个玩家。

public class CarSteering : NetworkBehaviour { 公共类CarSteering:NetworkBehaviour {

Rigidbody2D rb;

Transform mainCamera;
Vector3 cameraOffset;
[SerializeField] float cameraDistance = 16f;
[SerializeField] float cameraHeight = 16f;

public controlMode CarControlMode;

public float MaxSpeed = 7.0f;
public float MaxSteer = 2.0f;
public float Breaks = 0.2f;

[SerializeField]
float Acceleration = 0.0f;
float Steer = 0.0f;

bool AccelFwd, AccelBwd;
bool TouchAccel,TouchBack,TouchBreaks;
bool SteerLeft, SteerRight;

// Use this for initialization
void Start () 
{   
    if (!isLocalPlayer) 
    {
        Destroy (this);
        return;
    }


    rb = GetComponent<Rigidbody2D> ();

    cameraOffset = new Vector3 (0f, cameraHeight, -cameraDistance);
    mainCamera = Camera.main.transform;
    MoveCamera ();
}

// Update is called once per frame
void FixedUpdate () 
{

    if (CarControlMode == controlMode.KeyBoard) 
    {
        if (Input.GetKey (KeyCode.UpArrow))
            Accel (1);                                                  //Accelerate in forward direction
        else if (Input.GetKey (KeyCode.DownArrow))
            Accel (-1);                                                 //Accelerate in backward direction
        else if (Input.GetKey (KeyCode.Space)) 
        {
            if (AccelFwd)
                StopAccel (1, Breaks);                                  //Breaks while in forward direction
            else if (AccelBwd)
                StopAccel (-1, Breaks);                                 //Breaks while in backward direction
        } 
        else 
        {
            if (AccelFwd)
                StopAccel (1, 0.1f);                                    //Applies breaks slowly if no key is pressed while in forward direction
            else if (AccelBwd)
                StopAccel (-1, 0.1f);                                   //Applies breaks slowly if no key is pressed while in backward direction
        }
    }
    MoveCamera ();

    if (CarControlMode == controlMode.Touch) 
    {
        if (TouchAccel)
            Accel (1);
        else if(TouchBack)
            Accel (-1);
        else if(TouchBreaks)
        {
            if (AccelFwd)
                StopAccel (1, Breaks);
            else if (AccelBwd)
                StopAccel (-1, Breaks); 
        }
        else
        {
            if (AccelFwd)
                StopAccel (1, 0.1f);
            else if (AccelBwd)
                StopAccel (-1, 0.1f);
        }
    }
    MoveCamera ();
}

// Functions to be called from Onscreen buttons for touch input.
public void SetTouchAccel(bool TouchState)
{
    TouchAccel = TouchState;
}

public void SetTouchBack(bool TouchState)
{
    TouchBack = TouchState;
}

public void SetTouchBreaks(bool TouchState)
{
    TouchBreaks = TouchState;
}

public void SetSteerLeft(bool TouchState)
{
    SteerLeft = TouchState;
}

public void SetSteerRight(bool TouchState)
{
    SteerRight = TouchState;
}

public void Accel(int Direction)
{
    if (Direction == 1) 
    {
        AccelFwd = true;
        if (Acceleration <= MaxSpeed) 
        {
            Acceleration += 0.05f;
        }

        if(CarControlMode == controlMode.KeyBoard)
        {
            if (Input.GetKey (KeyCode.LeftArrow))
                transform.Rotate (Vector3.forward * Steer);             //Steer left
            if (Input.GetKey (KeyCode.RightArrow))
                transform.Rotate (Vector3.back * Steer);                //steer right
        }
        else if(CarControlMode == controlMode.Touch)
        {
            if(SteerLeft)
                transform.Rotate (Vector3.forward * Steer);
            else if(SteerRight)
                transform.Rotate (Vector3.back * Steer);
        }
    } 
    else if (Direction == -1) 
    {
        AccelBwd = true;
        if ((-1 * MaxSpeed) <= Acceleration) 
        {
            Acceleration -= 0.05f;
        }

        if(CarControlMode == controlMode.KeyBoard)
        {
            if (Input.GetKey (KeyCode.LeftArrow))
                transform.Rotate (Vector3.back * Steer);                //Steer left (while in reverse direction)
            if (Input.GetKey (KeyCode.RightArrow))
                transform.Rotate (Vector3.forward * Steer);             //Steer left (while in reverse direction)
        }
        else if(CarControlMode == controlMode.Touch)
        {
            if(SteerLeft)
                transform.Rotate (Vector3.forward * Steer);
            else if(SteerRight)
                transform.Rotate (Vector3.back * Steer);
        }
    }

    if (Steer <= MaxSteer)
        Steer += 0.01f;

    if(CarControlMode == controlMode.Touch)
        transform.Translate (Vector2.up * Acceleration * Time.deltaTime);
    else if(CarControlMode == controlMode.KeyBoard)
        transform.Translate (Vector2.up * Acceleration * Time.deltaTime);
    MoveCamera ();
}

public void StopAccel(int Direction, float BreakingFactor)
{
    if (Direction == 1) 
    {
        if (Acceleration >= 0.0f) 
        {
            Acceleration -= BreakingFactor;

            if (CarControlMode == controlMode.KeyBoard) 
            {
                if (Input.GetKey (KeyCode.LeftArrow))
                    transform.Rotate (Vector3.forward * Steer);
                if (Input.GetKey (KeyCode.RightArrow))
                    transform.Rotate (Vector3.back * Steer);
            }
            else if(CarControlMode == controlMode.Touch)
            {
                if(SteerLeft)
                    transform.Rotate (Vector3.forward * Steer);
                else if(SteerRight)
                    transform.Rotate (Vector3.back * Steer);
            }
        }
        else
            AccelFwd = false;
    } 
    else if (Direction == -1) 
    {
        if(Acceleration <= 0.0f)
        {
            Acceleration += BreakingFactor;

            if (CarControlMode == controlMode.KeyBoard) 
            {
                if (Input.GetKey (KeyCode.LeftArrow))
                    transform.Rotate (Vector3.back * Steer);
                if (Input.GetKey (KeyCode.RightArrow))
                    transform.Rotate (Vector3.forward * Steer);
            }
            else if(CarControlMode == controlMode.Touch)
            {
                if(SteerLeft)
                    transform.Rotate (Vector3.forward * Steer);
                else if(SteerRight)
                    transform.Rotate (Vector3.back * Steer);
            }
        }
        else
            AccelBwd = false;
    }

    if (Steer >= 0.0f)
        Steer -= 0.01f;

    transform.Translate (Vector2.up * Acceleration * Time.deltaTime);
    MoveCamera ();
}

void OnCollisionEnter2D(Collision2D col){
    if (col.gameObject.tag == "Obstacles") {
        Destroy (GameObject.FindGameObjectWithTag ("Obstacles"));
    } else if (col.gameObject.tag == "win") {
        SceneManager.LoadScene ("Youwin");
    }
}

void MoveCamera()
{
    mainCamera.position = transform.position;
    mainCamera.rotation = transform.rotation;
    mainCamera.Translate (cameraOffset);
    mainCamera.LookAt (transform);
}

} }

确保Api兼容层不是游戏构建设置(其他设置)中的.NET 2.0子集,因为它只支持单点触摸。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM