Слежение за мышью и передвижение от 3го лица
Добавлено: 08 янв 2015, 22:49
Искал описание задачи, но так вразумительных пояснений ни где не нашел, потому делюсь собственной разработкой.
Сразу оговорюсь, что это не идеальное решение, а "костыль", так как заставить следить за мышкой конкретную часть обьекта (башню) на прямую у меня не получилось.
Буду благодарен, если форумчане подскажут, как улучшить код.
Задача: задать слежение башни танка (головы персонажа, оружия и т.п.) за мышкой в ограниченных углах, при этом с возможностью управлять корпусом с клавиатуры.
В качестве цели, за которой следит башня я выбрал пустой обьект Target. Он же выполняет роль точки, куда полетят снаряды моего оружия.
На башню вешаем скрипт
На Target вешаем скрипт слежения за мышью. Это переделанный скрипт Mouse Orbit.
Ну а на сам танк (персонажа) вешаем скрипт управления с клавиатуры, которых полно в интернете.
Что бы камера следила за мишенью вешаем ее как дочернюю на башню или прописываем в ней скрипт LookAt
В итоге имеем персонажа, который бегает с клавиатуры и следит за мышкой (точнее за целью, которая движется за мышкой) Если отключить отображение курсора мыши, то разница почти не заметна.
Сразу оговорюсь, что это не идеальное решение, а "костыль", так как заставить следить за мышкой конкретную часть обьекта (башню) на прямую у меня не получилось.
Буду благодарен, если форумчане подскажут, как улучшить код.
Задача: задать слежение башни танка (головы персонажа, оружия и т.п.) за мышкой в ограниченных углах, при этом с возможностью управлять корпусом с клавиатуры.
В качестве цели, за которой следит башня я выбрал пустой обьект 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
В итоге имеем персонажа, который бегает с клавиатуры и следит за мышкой (точнее за целью, которая движется за мышкой) Если отключить отображение курсора мыши, то разница почти не заметна.