碰撞器
首先需要设置一下碰撞器用来进行背刺的碰撞检测
需要一个BackStab Collider,有一个Box Collider和一个BackStabCollider的脚本。
public class BackStabCollider : MonoBehaviour
{
public Transform backStabberStandPoint;
}
感觉这个脚本有点没必要。
然后Critical RayCast Start Point只有一个Transform,用来表示玩家进行背刺时使用射线检测的起始位置。
Back Stabber Standing Point该对象被背刺触发动画时,敌人所应该在的位置。
逻辑实现
主要就是调整位置调整朝向,播放动画造成伤害。
public void AttemptBackStabOrRiposte()
{
RaycastHit hit;
if (Physics.Raycast(inputHandler.criticalAttackRayCastStartPoint.position, transform.TransformDirection(Vector3.forward), out hit, 0.5f, backStabLayer)){
CharacterManager enemyCharacterManager = hit.transform.gameObject.GetComponent<CharacterManager>();
if(enemyCharacterManager != null)
{
//Check for team id so you cannot back stab friends or yourself
//pull is into a transform behind the enemy so the backstab looks clean
//rotate us towards that transform
//play animation
//make enemy play animation
//do damage
playerManager.transform.position = enemyCharacterManager.backStabCollider.backStabberStandPoint.position;
Vector3 rotationDirection = playerManager.transform.eulerAngles;
rotationDirection = hit.transform.position - playerManager.transform.position;
rotationDirection.y = 0;
rotationDirection.Normalize();
Quaternion tr = Quaternion.LookRotation(rotationDirection);
Quaternion targetRotation = Quaternion.Slerp(playerManager.transform.rotation, tr, 800 * Time.deltaTime);
playerManager.transform.rotation = targetRotation;
animatorHandler.PlayTargetAnimation("Back Stab", true);
enemyCharacterManager.GetComponentInChildren<AnimatorManager>().PlayTargetAnimation("Back Stabbed", true);
}
}