Files
2026-03-30 20:11:57 +07:00

71 lines
2.1 KiB
C#

using FishNet.Connection;
using FishNet.Object;
using UnityEngine;
namespace FishNet.Example.Scened
{
public class PlayerController : NetworkBehaviour
{
[SerializeField]
private GameObject _camera;
[SerializeField]
private float _moveRate = 4f;
[SerializeField]
private bool _clientAuth = true;
private void Awake()
{
Debug.Log(transform.position);
}
public override void OnStartClient()
{
if (IsOwner)
_camera.SetActive(true);
}
private void Update()
{
if (!IsOwner)
return;
float hor = Input.GetAxisRaw("Horizontal");
float ver = Input.GetAxisRaw("Vertical");
/* If ground cannot be found for 20 units then bump up 3 units.
* This is just to keep player on ground if they fall through
* when changing scenes. */
if (_clientAuth || (!_clientAuth && IsServerStarted))
{
if (!Physics.Linecast(transform.position + new Vector3(0f, 0.3f, 0f), transform.position - Vector3.one * 20f))
transform.position += new Vector3(0f, 3f, 0f);
}
if (_clientAuth)
Move(hor, ver);
else
ServerMove(hor, ver);
}
[ServerRpc]
private void ServerMove(float hor, float ver)
{
Move(hor, ver);
}
private void Move(float hor, float ver)
{
float gravity = -10f * Time.deltaTime;
// If ray hits floor then cancel gravity.
Ray ray = new(transform.position + new Vector3(0f, 0.05f, 0f), -Vector3.up);
if (Physics.Raycast(ray, 0.1f + -gravity))
gravity = 0f;
/* Moving. */
Vector3 direction = new(0f, gravity, ver * _moveRate * Time.deltaTime);
transform.position += transform.TransformDirection(direction);
transform.Rotate(new(0f, hor * 100f * Time.deltaTime, 0f));
}
}
}