98 lines
2.5 KiB
C#
98 lines
2.5 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace ARTNGAME.Skymaster
|
|
{
|
|
public class AeroplaneControlSurfaceAnimatorSM : MonoBehaviour
|
|
{
|
|
[Serializable]
|
|
public class ControlSurface
|
|
{
|
|
public enum Type
|
|
{
|
|
Aileron = 0,
|
|
Elevator = 1,
|
|
Rudder = 2,
|
|
RuddervatorNegative = 3,
|
|
RuddervatorPositive = 4
|
|
}
|
|
|
|
public Transform transform;
|
|
|
|
public float amount;
|
|
|
|
public Type type;
|
|
|
|
[HideInInspector]
|
|
public Quaternion originalLocalRotation;
|
|
}
|
|
|
|
[SerializeField]
|
|
private float m_Smoothing = 5f;
|
|
|
|
[SerializeField]
|
|
private ControlSurface[] m_ControlSurfaces;
|
|
|
|
private AeroplaneControllerSM m_Plane;
|
|
|
|
private void Start()
|
|
{
|
|
m_Plane = GetComponent<AeroplaneControllerSM>();
|
|
ControlSurface[] controlSurfaces = m_ControlSurfaces;
|
|
foreach (ControlSurface obj in controlSurfaces)
|
|
{
|
|
obj.originalLocalRotation = obj.transform.localRotation;
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
ControlSurface[] controlSurfaces = m_ControlSurfaces;
|
|
foreach (ControlSurface controlSurface in controlSurfaces)
|
|
{
|
|
switch (controlSurface.type)
|
|
{
|
|
case ControlSurface.Type.Aileron:
|
|
{
|
|
Quaternion rotation5 = Quaternion.Euler(controlSurface.amount * m_Plane.RollInput, 0f, 0f);
|
|
RotateSurface(controlSurface, rotation5);
|
|
break;
|
|
}
|
|
case ControlSurface.Type.Elevator:
|
|
{
|
|
Quaternion rotation4 = Quaternion.Euler(controlSurface.amount * (0f - m_Plane.PitchInput), 0f, 0f);
|
|
RotateSurface(controlSurface, rotation4);
|
|
break;
|
|
}
|
|
case ControlSurface.Type.Rudder:
|
|
{
|
|
Quaternion rotation3 = Quaternion.Euler(0f, controlSurface.amount * m_Plane.YawInput, 0f);
|
|
RotateSurface(controlSurface, rotation3);
|
|
break;
|
|
}
|
|
case ControlSurface.Type.RuddervatorPositive:
|
|
{
|
|
float num2 = m_Plane.YawInput + m_Plane.PitchInput;
|
|
Quaternion rotation2 = Quaternion.Euler(0f, 0f, controlSurface.amount * num2);
|
|
RotateSurface(controlSurface, rotation2);
|
|
break;
|
|
}
|
|
case ControlSurface.Type.RuddervatorNegative:
|
|
{
|
|
float num = m_Plane.YawInput - m_Plane.PitchInput;
|
|
Quaternion rotation = Quaternion.Euler(0f, 0f, controlSurface.amount * num);
|
|
RotateSurface(controlSurface, rotation);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void RotateSurface(ControlSurface surface, Quaternion rotation)
|
|
{
|
|
Quaternion b = surface.originalLocalRotation * rotation;
|
|
surface.transform.localRotation = Quaternion.Slerp(surface.transform.localRotation, b, m_Smoothing * Time.deltaTime);
|
|
}
|
|
}
|
|
}
|