Files
decay-grid/Assets/Scripts/Infrastructure/Unity/NpcController.cs

74 lines
2.1 KiB
C#

using System;
using KBCore.Refs;
using UnityEngine;
using UnityEngine.AI;
using Random = UnityEngine.Random;
namespace Infrastructure.Unity
{
[RequireComponent(typeof(Rigidbody))]
public class NpcController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 6f;
[SerializeField] private float changeDirInterval = 1f;
[SerializeField] private LayerMask tileLayer;
[Self] [SerializeField] private Rigidbody rb;
private Vector3 _currentDir;
private float _timer;
private Func<float> _timeDilationProvider;
public void Initialize(Func<float> timeDilationProvider)
{
_timeDilationProvider = timeDilationProvider;
}
private void Awake()
{
PickNewDirection();
}
private void Update()
{
_timer += Time.deltaTime;
if (_timer >= changeDirInterval)
{
_timer = 0;
PickNewDirection();
}
}
private void FixedUpdate()
{
var dilation = _timeDilationProvider?.Invoke() ?? 1f;
rb.MovePosition(rb.position + _currentDir * (moveSpeed * dilation * Time.fixedDeltaTime));
if (Physics.Raycast(transform.position, Vector3.down, out var hit, 2.0f, tileLayer))
{
if (hit.collider.TryGetComponent<TileViewAdapter>(out var tile))
{
tile.OnPlayerStep();
}
}
}
private bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, out var hit, 2.0f, tileLayer);
}
private void PickNewDirection()
{
var rand = Random.Range(0, 4);
switch (rand)
{
case 0: _currentDir = Vector3.forward; break;
case 1: _currentDir = Vector3.back; break;
case 2: _currentDir = Vector3.left; break;
case 3: _currentDir = Vector3.right; break;
}
}
}
}