Сразу оговорюсь, что это не идеальное решение, а "костыль", так как заставить следить за мышкой конкретную часть обьекта (башню) на прямую у меня не получилось.
Буду благодарен, если форумчане подскажут, как улучшить код.
Задача: задать слежение башни танка (головы персонажа, оружия и т.п.) за мышкой в ограниченных углах, при этом с возможностью управлять корпусом с клавиатуры.
В качестве цели, за которой следит башня я выбрал пустой обьект Target. Он же выполняет роль точки, куда полетят снаряды моего оружия.
На башню вешаем скрипт
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class LookAt : MonoBehaviour {
public Transform Target; //Назначает обьект Target, который будет мишенью и в который полетят снаряды
void LateUpdate ()
{
transform.LookAt(Target); //следить за обьектом Target
}
void Start ()
{
}
void Update ()
{
}
}
using System.Collections;
public class LookAt : MonoBehaviour {
public Transform Target; //Назначает обьект Target, который будет мишенью и в который полетят снаряды
void LateUpdate ()
{
transform.LookAt(Target); //следить за обьектом Target
}
void Start ()
{
}
void Update ()
{
}
}
На Target вешаем скрипт слежения за мышью. Это переделанный скрипт Mouse Orbit.
Синтаксис:
Используется javascript
var target : Transform;
var distance = 3.0; // расстояние от персонажа, на котором держится мишень
var robot : GameObject; // наш персонаж
//скорость движения мишени по оси Х и по оси Y
var xSpeed = 250.0;
var ySpeed = 120.0;
// Минимальные и максимальные углы ограничения по X и Y относительно персонажа
var yMinLimit = -60;
var yMaxLimit = 0;
var xMinLimit = -60;
var xMaxLimit = 60;
//временные переменные
private var x = 0.0;
private var y = 0.0;
function Start ()
{
robot = GameObject.Find("robot");
}
function Update ()
{
//получаем координаты мыши
x += (Input.GetAxis("Mouse X") * xSpeed * 0.02);
y -=(Input.GetAxis("Mouse Y") * ySpeed * 0.02);
//ограничиваем координаты мыши, если это требуется
x = ClampAngle(x, xMinLimit, xMaxLimit);
y = ClampAngle(y, yMinLimit, yMaxLimit);
//поворачиваем мишень исходя из полученных координат мыши и углов поворота персонажа
var rotation = Quaternion.Euler(y, robot.transform.eulerAngles.y + x, 0);
var position = rotation * Vector3(0, 0, distance) + target.position;
//присваиваем полученные значения мишени
transform.rotation = rotation;
transform.position = position;
}
static function ClampAngle (angle : float, min : float, max : float)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}
var distance = 3.0; // расстояние от персонажа, на котором держится мишень
var robot : GameObject; // наш персонаж
//скорость движения мишени по оси Х и по оси Y
var xSpeed = 250.0;
var ySpeed = 120.0;
// Минимальные и максимальные углы ограничения по X и Y относительно персонажа
var yMinLimit = -60;
var yMaxLimit = 0;
var xMinLimit = -60;
var xMaxLimit = 60;
//временные переменные
private var x = 0.0;
private var y = 0.0;
function Start ()
{
robot = GameObject.Find("robot");
}
function Update ()
{
//получаем координаты мыши
x += (Input.GetAxis("Mouse X") * xSpeed * 0.02);
y -=(Input.GetAxis("Mouse Y") * ySpeed * 0.02);
//ограничиваем координаты мыши, если это требуется
x = ClampAngle(x, xMinLimit, xMaxLimit);
y = ClampAngle(y, yMinLimit, yMaxLimit);
//поворачиваем мишень исходя из полученных координат мыши и углов поворота персонажа
var rotation = Quaternion.Euler(y, robot.transform.eulerAngles.y + x, 0);
var position = rotation * Vector3(0, 0, distance) + target.position;
//присваиваем полученные значения мишени
transform.rotation = rotation;
transform.position = position;
}
static function ClampAngle (angle : float, min : float, max : float)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}
Ну а на сам танк (персонажа) вешаем скрипт управления с клавиатуры, которых полно в интернете.
Что бы камера следила за мишенью вешаем ее как дочернюю на башню или прописываем в ней скрипт LookAt
В итоге имеем персонажа, который бегает с клавиатуры и следит за мышкой (точнее за целью, которая движется за мышкой) Если отключить отображение курсора мыши, то разница почти не заметна.