众所周知,上坡客服重力做功,重力势能增加,费力;下坡重力做正功,重力势能减少,省力(又回到初中物理(lll¬ω¬)),所以上坡跑的慢,下坡跑得快也很合理。
先上效果
实现原理
一共需要的向量只有两个:①角色前向的方向向量forwardVector,②角色垂直向下发射一条打到地面的射线,射线与地面交点的法线方向normalVector。
这两个向量点乘后的结果就可以获得角色和斜坡之间的夹角。
如果角色平行与斜坡站立,那么夹角就是90度。如果角色面向斜坡站立,夹角会大于90度;反之则小于90度。
在update中计算这个夹角,并根据夹角的大小设置玩家的移动速度增益即可。
protected onUpdate(dt: number): void {
const startLoc = this.char.worldLocation;
const hitPoints = Gameplay.lineTrace(startLoc, startLoc.clone().add(Vector.down.multiply(200)), false, true, [], false, this.char);
if (hitPoints.length > 0) {
const hitPoint = hitPoints[0];
const slopeNormal = hitPoint.impactNormal;
const anglecos = Vector.dot(this.char.forwardVector, slopeNormal);
let angle = 90 - Math.acos(anglecos) * 180 / Math.PI;
let param = 1;
param = 1 + 2 * (angle / 90);
this.char.maxWalkSpeed = 600 * param;
}
}
示例项目
airplane.rar
(63.2 KB, 下载次数: 53)
|