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(); } if (cameraTransform == null) { var thirdPersonCamera = GetComponentInChildren(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); } } }