88 lines
3.2 KiB
C#
88 lines
3.2 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Serialization;
|
|
|
|
|
|
namespace SplashEdit.RuntimeCode
|
|
{
|
|
[Icon("Packages/net.psxsplash.splashedit/Icons/PSXPlayer.png")]
|
|
public class PSXPlayer : MonoBehaviour
|
|
{
|
|
[Header("Player Dimensions")]
|
|
[FormerlySerializedAs("PlayerHeight")]
|
|
[Tooltip("Camera eye height above the player's feet")]
|
|
[SerializeField] private float playerHeight = 1.8f;
|
|
|
|
[Tooltip("Collision radius for wall sliding")]
|
|
[SerializeField] private float playerRadius = 0.5f;
|
|
|
|
[Header("Movement")]
|
|
[Tooltip("Walk speed in world units per second")]
|
|
[SerializeField] private float moveSpeed = 3.0f;
|
|
|
|
[Tooltip("Sprint speed in world units per second")]
|
|
[SerializeField] private float sprintSpeed = 8.0f;
|
|
|
|
[Header("Navigation")]
|
|
[Tooltip("Maximum height the agent can step up")]
|
|
[SerializeField] private float maxStepHeight = 0.35f;
|
|
|
|
[Tooltip("Maximum walkable slope angle in degrees")]
|
|
[SerializeField] private float walkableSlopeAngle = 46.0f;
|
|
|
|
[Tooltip("Voxel size in XZ plane (smaller = more accurate but slower)")]
|
|
[SerializeField] private float navCellSize = 0.05f;
|
|
|
|
[Tooltip("Voxel height (smaller = more accurate vertical resolution)")]
|
|
[SerializeField] private float navCellHeight = 0.025f;
|
|
|
|
[Header("Jump & Gravity")]
|
|
[Tooltip("Peak jump height in world units")]
|
|
[SerializeField] private float jumpHeight = 2.0f;
|
|
|
|
[Tooltip("Downward acceleration in world units per second squared (positive value)")]
|
|
[SerializeField] private float gravity = 20.0f;
|
|
|
|
// Public accessors
|
|
public float PlayerHeight => playerHeight;
|
|
public float PlayerRadius => playerRadius;
|
|
public float MoveSpeed => moveSpeed;
|
|
public float SprintSpeed => sprintSpeed;
|
|
public float MaxStepHeight => maxStepHeight;
|
|
public float WalkableSlopeAngle => walkableSlopeAngle;
|
|
public float NavCellSize => navCellSize;
|
|
public float NavCellHeight => navCellHeight;
|
|
public float JumpHeight => jumpHeight;
|
|
public float Gravity => gravity;
|
|
public Vector3 CamPoint { get; protected set; }
|
|
|
|
public void FindNavmesh()
|
|
{
|
|
// Raycast down from the transform to find the ground,
|
|
// then place CamPoint at ground + playerHeight
|
|
if (Physics.Raycast(transform.position, Vector3.down, out RaycastHit hit, 100f))
|
|
{
|
|
CamPoint = hit.point + new Vector3(0, playerHeight, 0);
|
|
}
|
|
else
|
|
{
|
|
// Fallback: no ground hit, use transform directly
|
|
CamPoint = transform.position + new Vector3(0, playerHeight, 0);
|
|
}
|
|
}
|
|
|
|
void OnDrawGizmos()
|
|
{
|
|
FindNavmesh();
|
|
|
|
// Red sphere at camera eye point
|
|
Gizmos.color = Color.red;
|
|
Gizmos.DrawSphere(CamPoint, 0.2f);
|
|
|
|
// Wireframe sphere at feet showing player radius
|
|
Gizmos.color = new Color(0f, 1f, 0f, 0.3f);
|
|
Vector3 feet = CamPoint - new Vector3(0, playerHeight, 0);
|
|
Gizmos.DrawWireSphere(feet, playerRadius);
|
|
}
|
|
}
|
|
}
|