Бодрого времени суток, я опять беспокою форум Тостер своими замудрёнными вопросами))) Вопрос таков как вращать пушку по оси y с помощью луча от центра камеры и передвижения мышки (Для поднимания и опускания пушки)... Для турельки уже сделал подобный способ и работает идеально...
Вот он:
//Движение турельки
Quaternion qTurret = Quaternion.LookRotation(planePoint - turretPosition,turretUpTransform);
turretTransform.rotation = Quaternion.RotateTowards(turretTransform.rotation, qTurret,30.0f * Time.deltaTime);
Делал я похожий способ, но пушка перевернулась на 90 и отпустить или поднять пушку нельзя...
Вот кусок с движением пушки:
//Движение пушки
Vector3 v = new Vector3(0,distanceToPlane,(planePoint - turretPosition).magnitude);
Quaternion qGun = Quaternion.LookRotation(v);
if(Quaternion.Angle(Quaternion.identity, qGun) <= 30.0f)
gunTransform.localRotation = Quaternion.RotateTowards(gunTransform.localRotation,qGun,30.0f * Time.deltaTime);
Пришлось мудрить и сделал я проще - MouseLookY... Всё бы ничего, но из-за того что в "Воображаемом" Корабле будет от 2 до 4 Управляемых пушек точность страдает...
Вот сценарий MouseLook'a:using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[AddComponentMenu("Camera-Control/Smooth Mouse Look")]
public class GunRotation : MonoBehaviour
{
public float sensitivityY = 15F;
public float minimumY = -30F;
public float maximumY = 30F;
float rotationY = 0F;
private List<float> rotArrayY = new List<float>();
float rotAverageY = 0F;
public float frameCounter = 20;
Quaternion originalRotation;
void Update()
{
rotAverageY = 0f;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotArrayY.Add(rotationY);
if (rotArrayY.Count >= frameCounter)
{
rotArrayY.RemoveAt(0);
}
for (int j = 0; j < rotArrayY.Count; j++)
{
rotAverageY += rotArrayY[j];
}
rotAverageY /= rotArrayY.Count;
rotAverageY = ClampAngle(rotAverageY, minimumY, maximumY);
Quaternion yQuaternion = Quaternion.AngleAxis(rotAverageY, Vector3.left);
transform.localRotation = originalRotation * yQuaternion;
}
void Start()
{
Rigidbody rb = GetComponent<Rigidbody>();
if (rb)
rb.freezeRotation = true;
originalRotation = transform.localRotation;
}
public static float ClampAngle(float angle, float min, float max)
{
angle = angle % 360;
if ((angle >= -360F) && (angle <= 360F))
{
if (angle < -360F)
{
angle += 360F;
}
if (angle > 360F)
{
angle -= 360F;
}
}
return Mathf.Clamp(angle, min, max);
}
}
Скриншот происходящего на сцене и в игре:
Если есть какие-нибудь варианты или материалы по этому поводу я буду рад)))
Заранее Спасибо за поддержку и помощь)