Здравствуйте, я новичок в Unity.
У меня есть многопользовательская Android-игра 2D, созданная в Unity, и я хотел иметь возможность управлять player1 и player2 с помощью сенсорных кнопок пользовательского интерфейса. Теперь проблема заключается в том, что я могу управлять только одним игроком, у которого есть дочерний элемент моего холста (имеет сенсорные кнопки пользовательского интерфейса) и триггер события. Что я могу сделать, чтобы управлять обоими игроками при использовании сенсорных кнопок пользовательского интерфейса в Unity Matchmaking.
открытый класс 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);
}
}