feat: Player
movement, with assets, and throwable head
This commit is contained in:
8
Assets/Code/Scripts/Player.meta
Normal file
8
Assets/Code/Scripts/Player.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 35fd21e5cd1e88f45ac493add1565094
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
38
Assets/Code/Scripts/Player/InputSystem.inputsettings.asset
Normal file
38
Assets/Code/Scripts/Player/InputSystem.inputsettings.asset
Normal file
@@ -0,0 +1,38 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: c46f07b5ed07e4e92aa78254188d3d10, type: 3}
|
||||
m_Name: InputSystem.inputsettings
|
||||
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputSettings
|
||||
m_SupportedDevices: []
|
||||
m_UpdateMode: 1
|
||||
m_ScrollDeltaBehavior: 0
|
||||
m_MaxEventBytesPerUpdate: 5242880
|
||||
m_MaxQueuedEventsPerUpdate: 1000
|
||||
m_CompensateForScreenOrientation: 1
|
||||
m_BackgroundBehavior: 0
|
||||
m_EditorInputBehaviorInPlayMode: 0
|
||||
m_InputActionPropertyDrawerMode: 0
|
||||
m_DefaultDeadzoneMin: 0.125
|
||||
m_DefaultDeadzoneMax: 0.925
|
||||
m_DefaultButtonPressPoint: 0.5
|
||||
m_ButtonReleaseThreshold: 0.75
|
||||
m_DefaultTapTime: 0.2
|
||||
m_DefaultSlowTapTime: 0.5
|
||||
m_DefaultHoldTime: 0.4
|
||||
m_TapRadius: 5
|
||||
m_MultiTapDelayTime: 0.75
|
||||
m_DisableRedundantEventsMerging: 0
|
||||
m_ShortcutKeysConsumeInputs: 0
|
||||
m_iOSSettings:
|
||||
m_MotionUsage:
|
||||
m_Enabled: 0
|
||||
m_Description:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23cbff887a25b3802a937fef9deab3ec
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
1098
Assets/Code/Scripts/Player/InputSystem_Actions.inputactions
Normal file
1098
Assets/Code/Scripts/Player/InputSystem_Actions.inputactions
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,14 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b319948d6750538498f201a24c05aef3
|
||||
ScriptedImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3}
|
||||
generateWrapperCode: 0
|
||||
wrapperCodePath:
|
||||
wrapperClassName:
|
||||
wrapperCodeNamespace:
|
||||
6
Assets/Code/Scripts/Player/PlayerAnimation.cs
Normal file
6
Assets/Code/Scripts/Player/PlayerAnimation.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class PlayerAnimation
|
||||
{
|
||||
|
||||
}
|
||||
2
Assets/Code/Scripts/Player/PlayerAnimation.cs.meta
Normal file
2
Assets/Code/Scripts/Player/PlayerAnimation.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3c207b98ba2f6229b84db151dd7b4255
|
||||
215
Assets/Code/Scripts/Player/PlayerMovement.cs
Normal file
215
Assets/Code/Scripts/Player/PlayerMovement.cs
Normal file
@@ -0,0 +1,215 @@
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
|
||||
public class PlayerMovement : MonoBehaviour
|
||||
{
|
||||
public InputActionAsset InputActions;
|
||||
|
||||
private InputAction m_moveAction;
|
||||
private InputAction m_lookAction;
|
||||
private InputAction m_jumpAction;
|
||||
private InputAction m_throwAction;
|
||||
private InputAction m_pickupAction;
|
||||
|
||||
private Vector2 m_moveAmt;
|
||||
private Vector2 m_lookAmt;
|
||||
|
||||
private Rigidbody m_rigidbody;
|
||||
|
||||
[Header("Camera/Head")]
|
||||
public Transform CameraTransform;
|
||||
public float MaxLookAngle = 90f;
|
||||
|
||||
private float m_verticalRotation = 0f;
|
||||
|
||||
public float WalkSpeed = 10;
|
||||
public float RotateSpeed = 5;
|
||||
public float JumpForce = 5;
|
||||
|
||||
public Transform GroundCheck;
|
||||
public float GroundCheckRadius = 0.2f;
|
||||
|
||||
public Animator animator;
|
||||
|
||||
[Header("Head Settings")]
|
||||
public Transform Head;
|
||||
public float ThrowForce = 10f;
|
||||
public float PickupDistance = 3f;
|
||||
|
||||
private bool m_isHeadThrown = false;
|
||||
private Rigidbody m_headRigidbody;
|
||||
|
||||
private Vector3 m_headInitialLocalPos;
|
||||
private Quaternion m_headInitialLocalRot;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
var map = InputActions.FindActionMap("Player");
|
||||
|
||||
m_moveAction = map.FindAction("Move");
|
||||
m_lookAction = map.FindAction("Look");
|
||||
m_jumpAction = map.FindAction("Jump");
|
||||
m_throwAction = map.FindAction("Throw");
|
||||
m_pickupAction = map.FindAction("Pickup");
|
||||
|
||||
m_rigidbody = GetComponent<Rigidbody>();
|
||||
animator = GetComponent<Animator>();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
InputActions.FindActionMap("Player").Enable();
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
InputActions.FindActionMap("Player").Disable();
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
Cursor.lockState = CursorLockMode.Locked;
|
||||
m_headInitialLocalPos = Head.localPosition;
|
||||
m_headInitialLocalRot = Head.localRotation;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
m_moveAmt = m_moveAction.ReadValue<Vector2>();
|
||||
m_lookAmt = m_lookAction.ReadValue<Vector2>();
|
||||
|
||||
if (m_jumpAction.WasPressedThisFrame())
|
||||
{
|
||||
Jump();
|
||||
}
|
||||
|
||||
if (m_throwAction.WasPressedThisFrame())
|
||||
{
|
||||
ThrowHead();
|
||||
}
|
||||
|
||||
if (m_pickupAction.WasPressedThisFrame())
|
||||
{
|
||||
TryPickupHead();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void FixedUpdate()
|
||||
{
|
||||
Walking();
|
||||
Rotating();
|
||||
}
|
||||
|
||||
private void Walking()
|
||||
{
|
||||
Vector3 move =
|
||||
transform.forward * m_moveAmt.y +
|
||||
transform.right * m_moveAmt.x;
|
||||
|
||||
m_rigidbody.MovePosition(
|
||||
m_rigidbody.position + move * WalkSpeed * Time.deltaTime
|
||||
);
|
||||
|
||||
bool isMoving = m_moveAmt.magnitude > 0.1f;
|
||||
animator.SetBool("isWalking", isMoving);
|
||||
}
|
||||
|
||||
|
||||
private void Rotating()
|
||||
{
|
||||
if (m_lookAmt.magnitude <= 0.01f)
|
||||
return;
|
||||
|
||||
if (!m_isHeadThrown)
|
||||
{
|
||||
// NORMAL BODY ROTATION
|
||||
float horizontalRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
||||
Quaternion deltaRotation = Quaternion.Euler(0, horizontalRotation, 0);
|
||||
m_rigidbody.MoveRotation(m_rigidbody.rotation * deltaRotation);
|
||||
|
||||
if (CameraTransform != null)
|
||||
{
|
||||
m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
||||
m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
||||
CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// HEAD ROTATION ON GROUND
|
||||
float headRotation = m_lookAmt.x * RotateSpeed * Time.deltaTime;
|
||||
Head.Rotate(0, headRotation, 0);
|
||||
|
||||
// Add vertical camera rotation when head is on ground
|
||||
if (CameraTransform != null)
|
||||
{
|
||||
m_verticalRotation -= m_lookAmt.y * RotateSpeed * Time.deltaTime;
|
||||
m_verticalRotation = Mathf.Clamp(m_verticalRotation, -MaxLookAngle, MaxLookAngle);
|
||||
CameraTransform.localRotation = Quaternion.Euler(m_verticalRotation, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Jump()
|
||||
{
|
||||
if (Physics.CheckSphere(GroundCheck.position, GroundCheckRadius, LayerMask.GetMask("Ground"))) {
|
||||
m_rigidbody.AddForce(Vector3.up * JumpForce, ForceMode.Impulse);
|
||||
}
|
||||
}
|
||||
|
||||
private void ThrowHead()
|
||||
{
|
||||
if (m_isHeadThrown)
|
||||
return;
|
||||
|
||||
animator.SetTrigger("Throw");
|
||||
|
||||
m_isHeadThrown = true;
|
||||
|
||||
Head.SetParent(null);
|
||||
|
||||
m_headRigidbody = Head.gameObject.AddComponent<Rigidbody>();
|
||||
m_headRigidbody.mass = 1f;
|
||||
|
||||
m_headRigidbody.constraints =
|
||||
RigidbodyConstraints.FreezeRotationX |
|
||||
RigidbodyConstraints.FreezeRotationZ;
|
||||
|
||||
m_headRigidbody.AddForce(CameraTransform.forward * ThrowForce, ForceMode.Impulse);
|
||||
}
|
||||
|
||||
private void TryPickupHead()
|
||||
{
|
||||
if (!m_isHeadThrown)
|
||||
return;
|
||||
|
||||
float distance = Vector3.Distance(transform.position, Head.position);
|
||||
|
||||
if (distance <= PickupDistance)
|
||||
{
|
||||
PickupHead();
|
||||
}
|
||||
}
|
||||
|
||||
private void PickupHead()
|
||||
{
|
||||
m_isHeadThrown = false;
|
||||
|
||||
// Remove Rigidbody
|
||||
if (m_headRigidbody != null)
|
||||
{
|
||||
Destroy(m_headRigidbody);
|
||||
}
|
||||
|
||||
// Reattach to player
|
||||
Head.SetParent(transform);
|
||||
|
||||
// Reset position & rotation
|
||||
Head.localPosition = m_headInitialLocalPos;
|
||||
Head.localRotation = m_headInitialLocalRot;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
2
Assets/Code/Scripts/Player/PlayerMovement.cs.meta
Normal file
2
Assets/Code/Scripts/Player/PlayerMovement.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1d8f349ed7dc088a4a6e2690ee87094a
|
||||
Reference in New Issue
Block a user