mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 19:34:47 +00:00
60 lines
2.3 KiB
C#
60 lines
2.3 KiB
C#
using UnityEngine;
|
|
using Pathfinding;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Pathfinding.Legacy {
|
|
using Pathfinding.RVO;
|
|
|
|
/// <summary>
|
|
/// RVO Character Controller.
|
|
/// Designed to be used as a drop-in replacement for the Unity Character Controller,
|
|
/// it supports almost all of the same functions and fields with the exception
|
|
/// that due to the nature of the RVO implementation, desired velocity is set in the Move function
|
|
/// and is assumed to stay the same until something else is requested (as opposed to reset every frame).
|
|
///
|
|
/// For documentation of many of the variables of this class: refer to the Pathfinding.RVO.IAgent interface.
|
|
///
|
|
/// Note: Requires an RVOSimulator in the scene
|
|
///
|
|
/// See: Pathfinding.RVO.IAgent
|
|
/// See: RVOSimulator
|
|
///
|
|
/// Deprecated: Use the RVOController class instead. This class only exists for compatibility reasons.
|
|
/// </summary>
|
|
[AddComponentMenu("Pathfinding/Legacy/Local Avoidance/Legacy RVO Controller")]
|
|
[HelpURL("https://arongranberg.com/astar/documentation/stable/class_pathfinding_1_1_legacy_1_1_legacy_r_v_o_controller.php")]
|
|
public class LegacyRVOController : RVOController {
|
|
/// <summary>
|
|
/// Layer mask for the ground.
|
|
/// The RVOController will raycast down to check for the ground to figure out where to place the agent.
|
|
/// </summary>
|
|
[Tooltip("Layer mask for the ground. The RVOController will raycast down to check for the ground to figure out where to place the agent")]
|
|
public new LayerMask mask = -1;
|
|
|
|
public new bool enableRotation = true;
|
|
public new float rotationSpeed = 30;
|
|
|
|
public override void OnSyncUpdate(int dt, JNFrameInfo frame, Object input)
|
|
{
|
|
base.OnSyncUpdate(dt, frame, input);
|
|
if (rvoAgent == null) return;
|
|
|
|
RaycastHit hit;
|
|
|
|
Vector3 pos = tr.position + CalculateMovementDelta(GetSync().Time.deltaTime);
|
|
|
|
if (mask != 0 && Physics.Raycast(pos + Vector3.up*height*0.5f, Vector3.down, out hit, float.PositiveInfinity, mask)) {
|
|
pos.y = hit.point.y;
|
|
} else {
|
|
pos.y = 0;
|
|
}
|
|
|
|
tr.position = pos + Vector3.up*(height*0.5f - center);
|
|
|
|
if (enableRotation && velocity != Vector3.zero) transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(velocity), GetSync().Time.deltaTime * rotationSpeed * Mathf.Min(velocity.magnitude, 0.2f));
|
|
|
|
}
|
|
|
|
}
|
|
}
|