unity学习笔记
实现人物进行相对位移以及人物移动和场景移动的切换
需求
让人物在球体上进行跑动
方法
使用摇杆控制移动(在圆形的球体上),按照之前控制charactercontroller移动会存在一些问题
人物移动到球体边缘的时候会因为重力的关系而掉到场景外,如果不设置重力那么人物又会漂浮在球体上,不可行
转换思路
通过摇杆的数据,控制星球的移动,通过相对位移实现人物移动的效果,这样能保证人物始终在一个地方,这样就不会出现移动到场景外的情况
通过获得摇杆的数据控制星球的rotate属性
direction = jsMovement.InputDirection;
//transform.Rotate(Vector3.up * -12 * Time.deltaTime);
transform.Rotate(Vector3.forward * direction.x*5 * Time.deltaTime);//forword是控制左右的
transform.Rotate(Vector3.left * direction.z*5 * Time.deltaTime);//forword是控制左右的
通过运行,发现是可以实现人物原地跑步,而场景中的模型在不断变化的,但是,同样的这也会遇到另一个问题
移动人物的时候,球体是不动的,所以当人物碰撞到球体上的物体(一定会出现的情况),碰撞发生后人物会因为星球的不停移动导致被碰撞体撞出原来的位置,这样同样会导致人物被移出场景外或者视角发生变化
解决办法
将上面的两个方法结合,当物体在球体中没有遇到其他碰撞体的时候,则打开旋转星球的方法;当人物遇到星球外的碰撞体时,则关闭星球旋转的方法,打开人物移动的方法
实现
通过人物的charactercontroller,获得人物与之碰撞的物体名称,如果遇到了不可穿透的碰撞体时,则关闭星球移动的脚本,打开人物移动的开关;如果没遇到了,则关闭人物移动的开关, 打开星球移动的脚本
关闭星球移动的脚本
if (transport.gameObject.name == "星球外的碰撞体"){
isHitted = true;
GameObject.Find("星球对象的名称").GetComponent<移动星球的脚本名称>().enabled = false;
}
打开人物移动的方法
if (direction.magnitude != 0 && isHitted)
{
character.SimpleMove(direction * moveSpeed);
}
if(transport.name.Contains("星球对象的名称"))
{
isHitted = false;//关闭人物移动的开关,打开星球移动的开关
GameObject.Find("pSphere1").GetComponent<testnetworkplayer>().enabled = true;
}
目前本人能想到的解决思路是这一种方法,如果大神们有其他更好的办法请务必分享一下~
更新了一下代码,发现不需要额外写一个bool去判断,直接根据碰撞的名称判断即可,写在update里即可
if(transport.name.Contains("Sphere"))
{
GameObject.Find("pSphere1").GetComponent<testnetworkplayer>().enabled = true;
}
if (!transport.name.Contains("Sphere"))
{
GameObject.Find("pSphere1").GetComponent<testnetworkplayer>().enabled = false;
//关闭星球移动的开关,打开人物移动的开关
if (direction.magnitude != 0)
{
character.SimpleMove(direction * moveSpeed);
}
}