110 lines
3.3 KiB
C#
Raw Normal View History

2024-10-17 17:23:05 +03:00
using UnityEngine;
using UnityEngine.UI;
namespace Mirror.Examples.CouchCoop
{
public class CouchPlayer : NetworkBehaviour
{
public Rigidbody rb;
public float movementSpeed = 3;
public float jumpSpeed = 6;
private float movementVelocity;
private bool isGrounded;
public CouchPlayerManager couchPlayerManager;
private KeyCode jumpKey = KeyCode.Space; // Check CouchPlayerManager for controls
private KeyCode leftKey = KeyCode.LeftArrow;
private KeyCode rightKey = KeyCode.RightArrow;
[SyncVar(hook = nameof(OnNumberChangedHook))]
public int playerNumber = 0;
public Text textPlayerNumber;
public override void OnStartAuthority()
{
this.enabled = true;
if (isOwned)
{
#if UNITY_2022_2_OR_NEWER
couchPlayerManager = GameObject.FindAnyObjectByType<CouchPlayerManager>();
#else
// Deprecated in Unity 2023.1
couchPlayerManager = GameObject.FindObjectOfType<CouchPlayerManager>();
#endif
// setup controls according to the pre-sets on CouchPlayerManager
jumpKey = couchPlayerManager.playerKeyJump[playerNumber];
leftKey = couchPlayerManager.playerKeyLeft[playerNumber];
rightKey = couchPlayerManager.playerKeyRight[playerNumber];
}
}
public void Start()
{
SetPlayerUI();
}
void Update()
{
if (!Application.isFocused) return;
if (isOwned == false) { return; }
// you can control all local players via arrow keys and space bar for fun testing
// otherwise check and set individual controls in CouchPlayerManager script.
if (isGrounded == true)
{
if (Input.GetKey(KeyCode.Space) || Input.GetKeyDown(jumpKey))
{
rb.velocity = new Vector2(rb.velocity.x, jumpSpeed);
}
}
movementVelocity = 0;
if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(leftKey))
{
movementVelocity = -movementSpeed;
}
if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(rightKey))
{
movementVelocity = movementSpeed;
}
rb.velocity = new Vector2(movementVelocity, rb.velocity.y);
}
[ClientCallback]
void OnCollisionExit(Collision col)
{
if (isOwned == false) { return; }
isGrounded = false;
}
[ClientCallback]
void OnCollisionStay(Collision col)
{
if (isOwned == false) { return; }
isGrounded = true;
}
void OnNumberChangedHook(int _old, int _new)
{
//Debug.Log(name + " - OnNumberChangedHook: " + playerNumber);
SetPlayerUI();
}
public void SetPlayerUI()
{
// called from hook and in start, to solve a race condition
if (isOwned)
{
textPlayerNumber.text = "Local: " + playerNumber;
}
else
{
textPlayerNumber.text = "Remote: " + playerNumber;
}
}
}
}