Files
gpd-925-en/SOLID/Assets/Scripts/NonSolid/PlayerController.cs
T

90 lines
2.9 KiB
C#

using System;
using UnityEngine;
using UnityEngine.InputSystem;
namespace NonSolid
{
[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{
[Header("Movement")]
[SerializeField] private float _speed = 10.0f;
[SerializeField] private float _rotationSpeed = 60.0f;
[Header("Firing")]
[SerializeField] private Transform _shootSpawn;
[SerializeField] private Rigidbody _projectilePrefab;
[SerializeField] private float _shootForce = 10.0f;
[SerializeField] private FireType _fireType = FireType.Bullet;
[Header("Inputs")]
[SerializeField] private InputActionReference _movementInputAction;
[SerializeField] private InputActionReference _rotationInputAction;
[SerializeField] private InputActionReference _fireInputAction;
private CharacterController _characterController;
private Vector2 _movement;
private Vector2 _rotation;
private void Awake()
{
_characterController = GetComponent<CharacterController>();
}
private void OnEnable()
{
_movementInputAction.action.Enable();
_rotationInputAction.action.Enable();
_fireInputAction.action.Enable();
_fireInputAction.action.performed += OnFireActionPerformed;
}
private void OnDisable()
{
_movementInputAction.action.Disable();
_rotationInputAction.action.Disable();
_fireInputAction.action.Disable();
_fireInputAction.action.performed -= OnFireActionPerformed;
}
private void Update()
{
HandleInput();
MoveAndRotate();
}
private void HandleInput()
{
_movement = _movementInputAction.action.ReadValue<Vector2>();
_rotation = _rotationInputAction.action.ReadValue<Vector2>();
}
private void MoveAndRotate()
{
transform.Rotate(0, _rotation.x * _rotationSpeed * Time.deltaTime, 0);
_characterController.Move(new Vector3(_movement.x, 0, _movement.y) * (_speed * Time.deltaTime));
}
private void Fire()
{
switch (_fireType)
{
case FireType.Bullet:
Rigidbody projectile = Instantiate(_projectilePrefab, _shootSpawn.position, _shootSpawn.rotation);
projectile.AddForce(_shootSpawn.forward * _shootForce, ForceMode.Impulse);
break;
case FireType.Spell:
break;
case FireType.Arrow:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
private void OnFireActionPerformed(InputAction.CallbackContext ctx)
{
Fire();
}
}
}