UI的组成元素主要有两个,一个外框,一个圆,创建一个父物体,用来接受点击和拖拽事件,设置框和圆为父物体的子物体。父物体的碰撞体可以做大一点,点击到区域内的,调整父物体的位置到点击的区域,圆的相对坐标设为0。平常不用虚拟摇杆的时候可以设置框和圆的透明度为0.5那样,点击和出发拖拽再tween到1。拖拽OnDraw(Vector2 v)-NGUI,IDragHandler.OnDrag(PointerEventData d)触发计算设置圆的位置,注意限制在框的半径中,可以用Distance判断。
计算摇杆的方向,然后映射到主角的移动方向上
//计算摇杆控制的方向 Vector3 direction = point.position - transform.position; direction = new Vector3(direction.x, 0f, direction.y); direction.Normalize(); //映射到目标模型上,调整目标方向 target.LookAt(target.position + direction); //计算相机的旋转偏差 Quaternion rot = Quaternion.Euler(0, camera.transform.eulerAngles.y, 0); target.LookAt(rot * target.forward);
在3D的世界中,观察世界的相机不一定就是正方向的去观察世界的,也许是45的,所以当将摇杆方向映射到主角时,也需要考虑相机的角度。
比如说:摇杆方向(圆心在正上),映射方向为(0,0,1),主角向前走,相机无旋转在主角z轴后面对着它,刚好圆心向上,主角在相机的视野中也是向上(前)。当相机y轴以45°观察时,就没有对到主角的z轴,主角还是向前走,但是在视野中确不是向上了(不和摇杆同一方向),而是往左上走了,所以需要将方向同相机一样旋转45度纠正回来,达到视野的移动方向和摇杆的一致。