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);
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淳杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值