109 lines
3.2 KiB
C#
109 lines
3.2 KiB
C#
using UnityEngine;
|
|
using MegaKoop.Game;
|
|
|
|
namespace MegaKoop.Game.Networking
|
|
{
|
|
[DisallowMultipleComponent]
|
|
public class SteamLocalInputSender : MonoBehaviour
|
|
{
|
|
[SerializeField] private SteamCharacterNetworkBridge characterNetwork;
|
|
[SerializeField] private float sendInterval = 0.05f;
|
|
[SerializeField] private Transform cameraTransform;
|
|
|
|
private float sendTimer;
|
|
|
|
private void Awake()
|
|
{
|
|
if (characterNetwork == null)
|
|
{
|
|
characterNetwork = GetComponent<SteamCharacterNetworkBridge>();
|
|
}
|
|
|
|
if (cameraTransform == null)
|
|
{
|
|
var thirdPersonCamera = GetComponentInChildren<ThirdPersonCamera>(true);
|
|
if (thirdPersonCamera != null)
|
|
{
|
|
cameraTransform = thirdPersonCamera.transform;
|
|
}
|
|
else if (characterNetwork != null && characterNetwork.IsLocalPlayer)
|
|
{
|
|
Camera mainCamera = Camera.main;
|
|
if (mainCamera != null && mainCamera.transform.IsChildOf(transform))
|
|
{
|
|
cameraTransform = mainCamera.transform;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (characterNetwork == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!characterNetwork.IsLocalPlayer || characterNetwork.IsAuthority)
|
|
{
|
|
return;
|
|
}
|
|
|
|
sendTimer -= Time.deltaTime;
|
|
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
|
|
moveInput = Vector2.ClampMagnitude(moveInput, 1f);
|
|
Vector2 planarMove = ConvertToWorldSpace(moveInput);
|
|
bool jumpPressed = Input.GetButtonDown("Jump");
|
|
|
|
if (sendTimer <= 0f || jumpPressed)
|
|
{
|
|
characterNetwork.SendLocalInput(planarMove, jumpPressed);
|
|
sendTimer = sendInterval;
|
|
}
|
|
}
|
|
|
|
public void SetCameraTransform(Transform camera)
|
|
{
|
|
cameraTransform = camera;
|
|
}
|
|
|
|
private Vector2 ConvertToWorldSpace(Vector2 moveInput)
|
|
{
|
|
if (cameraTransform == null)
|
|
{
|
|
return moveInput;
|
|
}
|
|
|
|
Vector3 forward = cameraTransform.forward;
|
|
Vector3 right = cameraTransform.right;
|
|
|
|
forward.y = 0f;
|
|
right.y = 0f;
|
|
|
|
float forwardSqr = forward.sqrMagnitude;
|
|
float rightSqr = right.sqrMagnitude;
|
|
if (forwardSqr < 0.0001f && rightSqr < 0.0001f)
|
|
{
|
|
return moveInput;
|
|
}
|
|
|
|
if (forwardSqr > 0.0001f)
|
|
{
|
|
forward.Normalize();
|
|
}
|
|
if (rightSqr > 0.0001f)
|
|
{
|
|
right.Normalize();
|
|
}
|
|
|
|
Vector3 desiredMove = forward * moveInput.y + right * moveInput.x;
|
|
if (desiredMove.sqrMagnitude > 1f)
|
|
{
|
|
desiredMove.Normalize();
|
|
}
|
|
|
|
return new Vector2(desiredMove.x, desiredMove.z);
|
|
}
|
|
}
|
|
}
|