Про то что так можно ограничить любое значение я в курсе. Но вообще мне более интересна возможность применения такой загогулины как Configurable Joint.))
Контекст применения - реализация башенного орудия (основание-башня вращается вокруг локальной оси Y, ствол - вокруг оси X), наводимого на цель. Ограничены как скорости поворотов (наведения) так и углы возвышения ствола \ поворота основания-башни. Башня стоит на другом меше, ствол - "дочка" от башни.
В принципе, первый вариант - "ручной": 1. взять плоскость в локальной XZ башни, задать границы поворотов как вектора в локальной системе координат башни. 2. выделить цель (bTarget) для башни - в плоскости XZ (проекцией на плоскость XZ башни) 3. затем - крутить башню через transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(bTarget.transform.position - transform.position), MaxRotation*Time.deltaTime); проверять углы между векторами-ограничителями 4. после завершения - ствол отдельно transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Target.transform.position - transform.position), MaxRotation*Time.deltaTime); (вариант громоздкий и мне не нравится)
второй вариант: через эйлеровы углы (взять углы между вектором направления ствола и вектором на цель, разделить на два угла - в XZ и по Y, крутить по одному - башню, по другому - ствол). Проверять углы на ограничения. (Я вот не очень дружу с эйлеровыми углами, получаю постоянно не ожидаемые результаты)
третий вариант: 1. посадить башню на меш через Configurable Joint 2. прикрепить к башне ствол через Configurable Joint 3. настроить оба Configurable Joint на угловые ограничения и скорости поворотов 4. Передавать в Configurable Joint'ы - кватернионы на цели (еще не пробовал)
Стандартный контроллер старый смотрели? Там какой-то мудак придумал делать для fps то, что нужно Вам. Но не забывайте то, что Вы написали выше. Правила форума · участникGCC
можно ссылку на "Стандартный контроллер старый" ? И что именно из написанного мною выше - не забывать?
Добавлено (19 Мар 2015, 20:39) --------------------------------------------- С Configurable Joint ничего не вышло. Пошёл "ручным" путём. Вот то что у меня получилось.
Работает для конструкции: 1. GameObject (заместо основания-носителя) 1.1. GameObject (GunTower) на котором висит меш башни 1.1.1. GameObject (GunLine) на котором висит меш ствола 1.1.1.1. GameObject (FirePoint) - точка генерации снаряда и эффекта выстрела
Такая конструкция для отвязки геометрии от перемещаемых объектов. Для себя оформил в префаб. В любой момент - взял и навесил нужные меши на GameObject'ы - механика работы не меняется.
Код
using UnityEngine; using System.Collections;
public class gunTracking : MonoBehaviour {
public GameObject TrackedObject = null; public GameObject gunTower = null; public GameObject gunLine = null;
public float hRotSpeed = 0.0f; public float vRotSpeed = 0.0f;
public float minHangle = -90.0f; public float maxHangle = 90.0f; public float minVangle = -10.0f; public float maxVangle = 50.0f;
public bool CanFire = true;
// Use this for initialization void Start () { gunTower = transform.FindChild("GunTower").gameObject; gunLine = gunTower.transform.FindChild ("GunLine").gameObject; }
Добавлено (20 Мар 2015, 14:15) --------------------------------------------- Хм. Некому заценить результат? Или сообщество вымерло?
Добавлено (25 Мар 2015, 07:52) --------------------------------------------- Мда... выяснил косяк в своём скрипте. Он работает только для горизонтальных GunTower. Если основание башни пушки наклоняется - башня стремится сохраниться своё положение. Не пойдёт.
Ушёл дорабатывать.
Добавлено (25 Мар 2015, 14:07) --------------------------------------------- Переделанная версия скрипта:
Код
using UnityEngine; using System.Collections;
public class gunTracking : MonoBehaviour {
public GameObject TrackedObject = null; public GameObject gunTower = null; public GameObject gunLine = null;
public float hRotSpeed = 0.0f; public float vRotSpeed = 0.0f;
public float minHangle = -90.0f; public float maxHangle = 90.0f; public float minVangle = -10.0f; public float maxVangle = 50.0f;
public bool CanFire = true; public bool ReadyToFire = true; public bool Disabled = false;
// Use this for initialization void Start () { gunTower = transform.FindChild ("GunTower").gameObject; gunLine = gunTower.transform.FindChild ("GunLine").gameObject; //trackingLimit = 30.0f; }
void Update () { if (Disabled) return;
if (TrackedObject) { //RotateToTarget( ); TrackTurret (gunTower.transform, gunLine.transform, TrackedObject.transform.position);