物理检测人物前上方的射线向下发射从人物前上方向下发一个射线得到击中点看是否在一个下限和上限之间。是则把人物移动到击中点一个偏移。同时播放动画。using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Mercenaria { /// summary /// 翻越功能。从人物前上方往下发射线得到击中点如果高度在 /// 上下限之间则把人物放到相对于击中点有一个偏移的位置同时 /// 做出攀爬动作。 /// /summary [RequireComponent(typeof(CharacterBase))] public class ClimbBehavior:MonoBehaviour { CharacterBase character; [SerializeField] Vector3 rayOriginnew 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() { characterGetComponentCharacterBase(); } 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.pointputCharOffset; character.characterController.enabledtrue; } else { Debug.Log(障碍高度不合适); } } else { Debug.Log(无障碍可翻越); } } } }移动以上实现了人物瞬移到障碍上为了让效果更好应该平滑移动让人物的支撑脚或手和目标点保持相对静止
Unity人物翻越功能
物理检测人物前上方的射线向下发射从人物前上方向下发一个射线得到击中点看是否在一个下限和上限之间。是则把人物移动到击中点一个偏移。同时播放动画。using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Mercenaria { /// summary /// 翻越功能。从人物前上方往下发射线得到击中点如果高度在 /// 上下限之间则把人物放到相对于击中点有一个偏移的位置同时 /// 做出攀爬动作。 /// /summary [RequireComponent(typeof(CharacterBase))] public class ClimbBehavior:MonoBehaviour { CharacterBase character; [SerializeField] Vector3 rayOriginnew 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() { characterGetComponentCharacterBase(); } 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.pointputCharOffset; character.characterController.enabledtrue; } else { Debug.Log(障碍高度不合适); } } else { Debug.Log(无障碍可翻越); } } } }移动以上实现了人物瞬移到障碍上为了让效果更好应该平滑移动让人物的支撑脚或手和目标点保持相对静止