物理检测:人物前上方的射线向下发射
从人物前上方向下发一个射线,得到击中点,看是否在一个下限和上限之间。是则把人物移动到击中点+一个偏移。同时播放动画。
cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Mercenaria
{
/// <summary>
/// 翻越功能。从人物前上方往下发射线,得到击中点,如果高度在
/// 上下限之间,则把人物放到相对于击中点有一个偏移的位置,同时
/// 做出攀爬动作。
/// </summary>
[RequireComponent(typeof(CharacterBase))]
public class ClimbBehavior:MonoBehaviour
{
CharacterBase character;
[SerializeField]
Vector3 rayOrigin=new Vector3(0,2,.5f);
[SerializeField]
Vector3 upperLimit= new Vector3(0,1.3f, .5f);
[SerializeField]
Vector3 lowerLimit = new Vector3(0,.3f, .5f);
[SerializeField]
float rayLen = 2;
[SerializeField]
Vector3 putCharOffset;
[SerializeField]
float gizmosRadius = .4f;
[SerializeField]
Color gizmosColor;
RaycastHit hit;
Vector3 worldOri
{
get {
return transform.TransformPoint(rayOrigin); }
}
Vector3 worldUL
{
get { return transform.TransformPoint(upperLimit); }
}
Vector3 worldLL
{
get { return transform.TransformPoint(lowerLimit); }
}
private void Awake()
{
character=GetComponent<CharacterBase>();
}
private void Start()
{
}
private void OnDrawGizmos()
{
Gizmos.color = gizmosColor;
Gizmos.DrawSphere(worldOri, gizmosRadius);
Gizmos.DrawSphere(worldUL, gizmosRadius);
Gizmos.DrawSphere(worldLL, gizmosRadius);
Gizmos.DrawRay(worldOri, Vector3.down * rayLen);
}
[ContextMenu("翻越")]
public void GetRaycastHit()
{
if(Physics.Raycast(worldOri, Vector3.down,out hit,rayLen,
MyGameManager.GroundLayerMask))
{
if(hit.point.y <worldUL.y&&
hit.point.y > worldLL.y)
{
character.characterController.enabled = false;
character.transform.position = hit.point+putCharOffset;
character.characterController.enabled=true;
}
else
{
Debug.Log("障碍高度不合适");
}
}
else
{
Debug.Log("无障碍可翻越");
}
}
}
}

移动
以上实现了人物瞬移到障碍上,为了让效果更好应该
- 平滑移动,让人物的支撑脚或手和目标点保持相对静止;