1. задача настроить камеру так, чтобы она не пролетала сквозь объекты. Для этого я думаю можно приближать камеру к игроку, но вот какреализовать? . По логике надо добавить сферический триггер-коллайдер + ригидбади с включенным is kinematic. Я использую стандартный скрипт smooth follow для камеры. в нем есть строка
transform.position -= currentRotation * Vector3.forward * distance;
вот distance и надо изменять, но вопрос как.
Сделал вариант с триггером для пробы, но камера начитает дрожать сильно при столкновении, и иногда проскакивает стену.
Синтаксис:
Используется javascript
var target : Transform;
// The distance in the x-z plane to the target
var distance = 5.0;
var dist_low =false;
// the height we want the camera to be above the target
var height = 5.0;
// How much we
var heightDamping = 2.0;
var rotationDamping = 3.0;
function LateUpdate () {
// Early out if we don't have a target
if (!target)
return;
// Calculate the current rotation angles
wantedRotationAngle = target.eulerAngles.y;
wantedHeight = target.position.y + height;
currentRotationAngle = transform.eulerAngles.y;
currentHeight = transform.position.y;
// Damp the rotation around the y-axis
currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
// Damp the height
currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);
// Convert the angle into a rotation
currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);
// Set the position of the camera on the x-z plane to:
// distance meters behind the target
transform.position = target.position;
//transform.position.x -=10;
if(dist_low==true) distance-=0.3;
else{
if(distance<5.0) distance+=0.2;
}
transform.position -= currentRotation * Vector3.forward * distance;
// Set the height of the camera
transform.position.y = currentHeight;
// Always look at the target
transform.LookAt (target);
//Debug.Log(distance);
}
function OnTriggerEnter (other : Collider) { // ставлю флаг коллизии для LastUpdate
dist_low=true;
Debug.Log("dist low"+distance);
}
function OnTriggerExit (other : Collider) {
dist_low =false;
}
// The distance in the x-z plane to the target
var distance = 5.0;
var dist_low =false;
// the height we want the camera to be above the target
var height = 5.0;
// How much we
var heightDamping = 2.0;
var rotationDamping = 3.0;
function LateUpdate () {
// Early out if we don't have a target
if (!target)
return;
// Calculate the current rotation angles
wantedRotationAngle = target.eulerAngles.y;
wantedHeight = target.position.y + height;
currentRotationAngle = transform.eulerAngles.y;
currentHeight = transform.position.y;
// Damp the rotation around the y-axis
currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
// Damp the height
currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);
// Convert the angle into a rotation
currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);
// Set the position of the camera on the x-z plane to:
// distance meters behind the target
transform.position = target.position;
//transform.position.x -=10;
if(dist_low==true) distance-=0.3;
else{
if(distance<5.0) distance+=0.2;
}
transform.position -= currentRotation * Vector3.forward * distance;
// Set the height of the camera
transform.position.y = currentHeight;
// Always look at the target
transform.LookAt (target);
//Debug.Log(distance);
}
function OnTriggerEnter (other : Collider) { // ставлю флаг коллизии для LastUpdate
dist_low=true;
Debug.Log("dist low"+distance);
}
function OnTriggerExit (other : Collider) {
dist_low =false;
}
Потому что камера двигается с разной скоростью, и менять distance нужно плавно, с учетом скорости коллизии, линейное изменение тут не подходит. Думаю надо смотреть в сторону OnCollisionEnter, но пока не доходит. Может есть стандартные решения, я искал не нашел.
2. вторая проблема, это поворот объекта относительно нужной точки. У меня есть цилиндр, на него вешаю поворот при помощи функции
f
Синтаксис:
Используется javascript
unction LateUpdate () {
y =- Input.GetAxis("Mouse Y") * ySpeed * 0.02;
transform.Rotate( 0, 0,Time.deltaTime+y );
}
y =- Input.GetAxis("Mouse Y") * ySpeed * 0.02;
transform.Rotate( 0, 0,Time.deltaTime+y );
}
Проблема в том что цилинд крутится относительно своего центра, а надо относительно края. Пробовал засунуть его в пустой объект и там сдвинуть относительно родительских координат как мне надо и применить скрипт вращения к родителю -но все равно цилиндр продолжает крутиться вокруг своего центра. Тут даже не знаю в какую сторону думать.