Камера вращается вокруг точки на оси истребителя (z)(Player в проекте). Угловая скорость вращения истребителя равна скорости вращения камеры и зависит напрямую от смещения курсора мыши от центра экрана(x,y). Истребитель(Ship) также ещё отклоняется на угол, который напрямую зависит от смещения мыши относительно центра экрана(dx,dy). (Чтобы не закрывать обзор при манёврах.)
Для этого я модифицировал OrbitCamera.js
- Код: Выделить всё
function LateUpdate () {
if (target) {
x=(Input.mousePosition.x-Screen.width*0.5)*0.1;
y=(Input.mousePosition.y-Screen.height*0.5)*0.1;
dx=(x-xold)*0.6;
dy=(y-yold)*0.6;
transform.Rotate(dy*Vector3.right -dx*Vector3.up+(-y*Vector3.right+x*Vector3.up)* Time.deltaTime);
xold=x;
yold=y;
var rotation = transform.rotation;
var targetPos = target.position;// + targetOffset;
var direction = rotation* -Vector3.forward;
var targetDistance = AdjustLineOfSight(targetPos, direction);
currentDistance = Mathf.SmoothDamp(currentDistance, targetDistance, distanceVelocity, closerSnapLag * .3);
transform.position = targetPos + direction * currentDistance;
}
}
и playerController.js здесь я вращаю сам корабль
- Код: Выделить всё
function FixedUpdate() {
if (isControllable) {
xx=(Input.mousePosition.x-Screen.width*0.5)*0.1;
yy=(Input.mousePosition.y-Screen.height*0.5)*0.1;
xxc=xx;
yyc=yy;
GameObject.Find("Ship").transform.Rotate(-yy*Vector3.right * Time.deltaTime);
GameObject.Find("Ship").transform.Rotate(xx*Vector3.up * Time.deltaTime);
transform.RotateAround(GameObject.Find("Ship").transform.position,GameObject.Find("Ship").transform.TransformDirection(Vector3.right),-yy*Time.deltaTime);
transform.RotateAround(GameObject.Find("Ship").transform.position,GameObject.Find("Ship").transform.TransformDirection(Vector3.up),xx*Time.deltaTime);
}
}
Это сработало, получилось как во freelancer.
Но возникла проблема. Когда я вращаю мышь вокруг центра экрана много раз, создаётся впечатление, у камеры появляется крен, а корабль уходит из поля зрения. Поиогите пожалуйста!! Постараюсь загрузить исходник на ftp.