unity3d游戏,武侠类,需要实现人物多段式轻功
思路就是点击轻功的时候,给角色一个向上的速度并转换动作,摇杆控制方向。把向上或向下的速度,与角色水平方向区分处理。
角色起跳前判断位置是否属于可跳
通过Physics.Raycast射线方式,判断角色脚下是否为walk层
//向下发射线
bool IsGrounded(float margin, string layerName = "Walk")
{
//本角色当前位置提高0.9f,然后向下发出1.2f的射线
Vector3 SourcePosition = transform.position;
Vector3 rayStartPoint = SourcePosition + new Vector3(0f, 0.9f, 0f);
RaycastHit hit;
LayerMask mask = 1 << LayerMask.NameToLayer(layerName);//射线打到walk层
if (Physics.Raycast(rayStartPoint, Vector3.down, out hit, margin, mask))
{
//Helper.LogError("距离:::::::::::"+hit.distance);
//Helper.DrawLine(rayStartPoint, hit.point, Color.red);
//如果射线打到walk层就返回true
return true;
}
else
{
return false;
}
}
- 起跳设置
首先人物身上挂CharacterController脚本
CharacterController controller = GetComponent<CharacterController>();
获取到CharacterController实例
核心起跳语句:
float gravity=10F;
float temp =10;
bool checkdis=false;//是否开始轻功计算
void setjump()
{
//点击起跳按钮后的初速度 只执行一次的
moveDirection.y = jumpUpSpeed1;
checkdis = true;
}
void FixedUpdate()
{
......
if(checkdis)
{
moveDirection.y = temp;//每次必须把上次计算的方向y值结果赋值给方向y值
//每一帧计算的,高度减值
moveDirection.y -= gravity * Time.deltaTime;
temp = moveDirection.y;
controller.Move(moveDirection * Time.deltaTime);//注意是一个方向
}
}
- 四段跳 判断动作名,以及下降阶段变动作的判断
bool result = false;
//获取当前动作的状态
AnimatorStateInfo animatorStateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (animatorStateInfo.IsName("jumpdown") || CurState == AnimatorState.JumpDown)
{
如果已经是降落状态,返回false
return result;
}
if (animatorStateInfo.normalizedTime >= 0.9f)
{
//动作播放超过了0.9秒,并且是属于四段跳中的一段,则返回true
if (animatorStateInfo.IsName("jump1") || animatorStateInfo.IsName("jump2") || animatorStateInfo.IsName("jump3") || animatorStateInfo.IsName("jump4"))
{
result = true;
}
}
在fixupdata里面判断动作播放情况,并根据时间(0.9f可以读配置)来改变动作
- 如何判断轻功落地停止
当起跳一段时间后,可以判断人物脚底是不是walk层,依此来判定是否落地
IsGrounded(1.2f)