一、Character Control非刚体
1、场景初始化,注意调整CC的轴心,不需要碰撞,且删除CC子物体的碰撞。
2、移动:
获取X,Z轴变化,定义变量h,v;
2、移动:
获取X,Z轴变化,定义变量h,v;
定义移动的速度speed;
定义跳跃的高度highjump;
因为非刚体,所以需要自定义重力,gravity,通常大于highjump;
定义CC的实体对象用于获取物体的CC组件;
定义移动的三维向量moveDirection;
定义用于落地判定的三维向量colextents;
3、视角观察与摄像机旋转:
3、视角观察与摄像机旋转:
定义摄像机实体对象,用于获取摄像机物体;
定义旋转速率:rspeed;
4、事件响应:
移动和跳跃都是物理行为,在FixedUpdate事件中实现动作
h,v获取键盘水平和垂直输入——判断是否着地(射线方法或者cc自带)——获取移动向量——判断是否在移动,是否在跳跃(水平或者垂直变量不为0,空格键输入)——三维移动向量乘以速度,三维向量的Y轴赋值highjump;
调用CC的move方法,参数是三维移动向量乘帧速率(获得每秒移动速度)。
5、Unity的CC落地bug,
使用自定义重力赋值三维向量的Y轴:moveDirect.y -= gravity * Time.deltaTime;
6、射线判断落地:
Ray ray = new Ray(this.transform.position + Vector3.up * 2 * colExtents.x, Vector3.down);
return Physics.SphereCast(ray, colExtents.x, colExtents.x + 0.2f);
7、鼠标控制旋转是二维的
如何确定鼠标控制物体旋转的坐标系,可以参考unity Scene场景中鼠标右键移动,观察坐标系移动。
为什么transform.collider没有bounds?collision.collider有bounds属性?
8、旋转后,物体的前方与移动方向同步
Vector3 forward = transform.TransformDirection(Vector3.forward)
世界坐标系与自身坐标系的转换。