OldBlueWater/BlueWater/Assets/02.Scripts/Character/Player/Player.cs

83 lines
2.7 KiB
C#
Raw Normal View History

using System;
using Sirenix.OdinInspector;
2023-09-27 02:55:13 +00:00
using UnityEngine;
2023-10-06 05:41:16 +00:00
using UnityEngine.InputSystem;
2023-09-27 02:55:13 +00:00
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
2023-10-06 05:41:16 +00:00
[RequireComponent(typeof(PlayerInput))]
public class Player : BaseCharacter, IDamageable, IView
2023-09-27 02:55:13 +00:00
{
2023-10-06 05:41:16 +00:00
protected Vector2 movementInput;
2023-10-05 04:11:46 +00:00
public virtual void TakeDamage(float attackerPower, float attackerShieldPenetrationRate = default, Vector3? attackPos = null)
{
throw new System.NotImplementedException();
}
public virtual void OnMove(InputValue value) // WASD
2023-10-06 05:41:16 +00:00
{
movementInput = value.Get<Vector2>();
}
#region Interfaces
// IView
[field: Title("IView")]
[field: SerializeField] public float ViewRadius { get; set; } = 15f;
[field: SerializeField] public float AtkRange { get; set; } = 1.5f;
[field: SerializeField] public Collider[] Targets { get; set; } = new Collider[MAX_COLLIDERS];
[field: SerializeField] public Collider Target { get; set; }
[field: SerializeField] public LayerMask TargetLayer { get; set; }
private const int MAX_COLLIDERS = 30;
public virtual void FindNearestTargetInRange(Vector3 centerPos, bool targetIsTrigger = true)
{
Array.Clear(Targets, 0, MAX_COLLIDERS);
var numResults = Physics.OverlapSphereNonAlloc(centerPos, ViewRadius, Targets, TargetLayer,
targetIsTrigger ? QueryTriggerInteraction.Collide : QueryTriggerInteraction.Ignore);
if (numResults <= 0)
{
SetTarget(null);
return;
}
var nearestDistance = ViewRadius * ViewRadius;
Collider nearestTargetCollider = null;
for (var i = 0; i < numResults; i++)
{
var distanceSqrToTarget = (centerPos - Targets[i].bounds.center).sqrMagnitude;
if (distanceSqrToTarget >= nearestDistance) continue;
nearestDistance = distanceSqrToTarget;
nearestTargetCollider = Targets[i];
}
SetTarget(nearestTargetCollider);
}
public virtual void SetTarget(Collider value)
{
Target = value;
}
public virtual bool IsTargetWithinRange(Vector3 centerPos, float range)
{
var inRange = Vector3.Distance(centerPos, Target.bounds.center) <= range;
return inRange;
}
public virtual void MoveTarget(Vector3 targetPos, float speed, float stopDistance = Single.MaxValue)
{
throw new NotImplementedException();
}
#endregion
2023-09-27 02:55:13 +00:00
}
}