132 lines
2.4 KiB
C#
132 lines
2.4 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
public class plasmaCutterSystem : MonoBehaviour
|
|
{
|
|
[Header ("Main Settings")]
|
|
[Space]
|
|
|
|
public Transform mainRotor;
|
|
|
|
public float initialRotorRotation;
|
|
|
|
public bool useFixedVerticalHorizontalRotations;
|
|
|
|
public float angleRotationAmount;
|
|
|
|
public float rotationSpeed;
|
|
|
|
public float manualRotationAmount;
|
|
|
|
[Space]
|
|
[Header ("Events Settings")]
|
|
[Space]
|
|
|
|
public UnityEvent eventOnFireWeapon;
|
|
|
|
public UnityEvent eventOnRotateWeapon;
|
|
|
|
bool rotating;
|
|
|
|
bool rotationToggleState;
|
|
|
|
Coroutine rotationCoroutine;
|
|
|
|
void Start ()
|
|
{
|
|
mainRotor.localEulerAngles = new Vector3 (0, 0, initialRotorRotation);
|
|
}
|
|
|
|
public void firePlasmaCutter ()
|
|
{
|
|
eventOnFireWeapon.Invoke ();
|
|
}
|
|
|
|
public void rotateRotorToRight ()
|
|
{
|
|
mainRotor.Rotate (manualRotationAmount * Vector3.forward);
|
|
}
|
|
|
|
public void rotateRotorToLeft ()
|
|
{
|
|
mainRotor.Rotate (manualRotationAmount * (-Vector3.forward));
|
|
}
|
|
|
|
public void changeRotorRotation ()
|
|
{
|
|
if (rotating) {
|
|
return;
|
|
}
|
|
|
|
float rotationAmount = 0;
|
|
|
|
if (useFixedVerticalHorizontalRotations) {
|
|
rotationToggleState = !rotationToggleState;
|
|
|
|
if (rotationToggleState) {
|
|
rotationAmount = 90;
|
|
} else {
|
|
rotationAmount = 0;
|
|
}
|
|
} else {
|
|
rotationAmount += angleRotationAmount;
|
|
|
|
if (rotationAmount > 360) {
|
|
rotationAmount = 360 - rotationAmount;
|
|
}
|
|
}
|
|
|
|
eventOnRotateWeapon.Invoke ();
|
|
|
|
stopChangeRotorRotation ();
|
|
|
|
rotationCoroutine = StartCoroutine (stopChangeRotorRotationCoroutine (rotationAmount));
|
|
}
|
|
|
|
public void stopChangeRotorRotation ()
|
|
{
|
|
if (rotationCoroutine != null) {
|
|
StopCoroutine (rotationCoroutine);
|
|
}
|
|
}
|
|
|
|
IEnumerator stopChangeRotorRotationCoroutine (float rotationAmount)
|
|
{
|
|
rotating = true;
|
|
|
|
Vector3 eulerTarget = Vector3.zero;
|
|
|
|
eulerTarget.z = rotationAmount;
|
|
|
|
Quaternion rotationTarget = Quaternion.Euler (eulerTarget);
|
|
|
|
float t = 0;
|
|
|
|
float movementTimer = 0;
|
|
|
|
bool targetReached = false;
|
|
|
|
float angleDifference = 0;
|
|
|
|
while (!targetReached) {
|
|
t += Time.deltaTime * rotationSpeed;
|
|
mainRotor.localRotation = Quaternion.Lerp (mainRotor.localRotation, rotationTarget, t);
|
|
|
|
movementTimer += Time.deltaTime;
|
|
|
|
angleDifference = Quaternion.Angle (mainRotor.localRotation, rotationTarget);
|
|
|
|
movementTimer += Time.deltaTime;
|
|
|
|
if (angleDifference < 0.2f || movementTimer > 2) {
|
|
targetReached = true;
|
|
}
|
|
yield return null;
|
|
}
|
|
|
|
rotating = false;
|
|
}
|
|
}
|