---------------2015.8.10---------2015.8.12-------李明阳--------------------
FeignDeath转Standing的高度问题:
Translation和RadiusHeitht:
Cylinder和Mesh的Translation默认情况下Z值是一致的,改变其中一个都会错位;Mesh经过Scale后经常需要调它们(Mesh)的位置。
默认情况下碰撞组件Translation不设,如果把它的Z值变大,角色就沉下去了。CylinderRadiusHeight的高低一旦改变,Mesh.Traslation需要相应调整。
调试追踪Position:角色倒地后,Mesh的Loc和Actor的Loc都会往上面调高,引擎这样设置,应该是为了让角色重新从上面落下来。但是我不想要这样的效果。在这个碰撞转换的时候,SetLocation也不起作用,想改变CylinderComponet的位置,没找到相关代码(这个好像不让改,SetPhysics它会掉下来的,改这个也没必要)。
当角色重新站起来的时候把它们Z方向上的值调低,角色从上面落下来的效果就不会很明显。
Actor组件基本上都是常量,无法直接附值,一般通过内置函数修改。
SetCollisionSize(10.0, 1);
Mesh.SetTranslation(vect(0.0,0.0,-3));
虽然效果不是很明显了,但是Cylinder的高度太低了。
尝试通过同样的代码方式先把它们调低然后再调回原来的值,效果不行,等于没调,角色还是会从上面落下来;如果通过控制时间来改回Z的值,当角色已经在地上站好后,碰撞组件突然加高,Cylinder是不会冒上来的,角色就从地面上掉下去。
最终的方案:
最后还是去找UTPawn.UC,有这样一句代码:
// If its positive, move back down by that amount until ithits the floor
if(UnFeignZAdjust > 0.0)
{
moveSmooth(vect(0,0,-1) * UnFeignZAdjust);
}
在Actor中有SetLocation和SetRotation用得较多,查看Actor.uc时发现有个同级函数Move,这个用得比较少。在这里UTPawn.uc的MoveSmooth解决了这个问题(Mesh.SetRBPosition也可以不需要了):和UTPawn类似在设置碰撞前调用moveSmooth(vect(0,0,-1) * 56);这个56是调试过程中Pawn倒下和站起来之后Location的高度差。
角色自动滑倒:
角色物理状态转换一切OK后,通过Pawn::Tick追踪角色所站位置的斜度,当达到一定斜度时调用PlayFeignDeath()。
BaseSockt
附加内容:(扩展)
PhysicsAssetInstance坐标:(UTPawn.uc)
CamStart = Mesh.GetPosition();
if(Mesh.PhysicsAssetInstance != None)
{
RootBodyInst = Mesh.PhysicsAssetInstance.Bodies[Mesh.PhysicsAssetInstance.RootBodyIndex];
if(RootBodyInst.IsValidBodyInstance())
{
RootBodyTM = RootBodyInst.GetUnrealWorldTM();
CamStart.X = RootBodyTM.WPlane.X;
CamStart.Y = RootBodyTM.WPlane.Y;
CamStart.Z = RootBodyTM.WPlane.Z;
}
}