BRO_TIGER
@BRO_TIGER
Indie Developer (C#, JS)

Как заставить коректно вращать (Трансформировать) Пушку турелки с помощью Луча?

Бодрого времени суток, я опять беспокою форум Тостер своими замудрёнными вопросами))) Вопрос таков как вращать пушку по оси 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);
    }
}


Скриншот происходящего на сцене и в игре:
7816aab780b543c99d84cd1d9b6ee5c4.png

Если есть какие-нибудь варианты или материалы по этому поводу я буду рад)))
Заранее Спасибо за поддержку и помощь)
  • Вопрос задан
  • 304 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы