BITFALL/Assets/BITKit/Unity/Scripts/Location/LocationAdditive.cs

84 lines
3.0 KiB
C#
Raw Normal View History

2023-06-08 14:09:50 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
2023-10-02 23:24:56 +08:00
using UnityEngine.Rendering;
2023-09-01 14:33:54 +08:00
// ReSharper disable InvertIf
2023-06-08 14:09:50 +08:00
namespace BITKit
{
2023-09-01 14:33:54 +08:00
public class LocationAdditive : MonoBehaviour
2023-06-08 14:09:50 +08:00
{
2023-11-30 00:23:23 +08:00
[SerializeField] private bool disabledRotation;
[SerializeField] private bool disabledPosition;
[SerializeField] private Vector3 positionWeight=Vector3.one;
[SerializeField] private Vector3 rotationWeight=Vector3.one;
2023-10-02 23:24:56 +08:00
public Vector3 GlobalPosition { get; private set; }
public Vector3 GlobalEuler { get; private set; }
public Vector3 GlobalRotation { get; private set; }
2023-11-30 00:23:23 +08:00
2023-09-01 14:33:54 +08:00
private Vector3 currentPosition;
private Vector3 currentEuler;
2023-11-30 00:23:23 +08:00
2023-10-02 23:24:56 +08:00
private Vector3 globalPosition;
private Quaternion globalRotation;
2023-11-30 00:23:23 +08:00
2023-06-08 14:09:50 +08:00
public void AddPosition(Vector3 value)
{
currentPosition += value;
}
2023-11-30 00:23:23 +08:00
2023-06-08 14:09:50 +08:00
public void AddEuler(Vector3 value)
{
2023-09-01 14:33:54 +08:00
currentEuler += value;
2023-06-08 14:09:50 +08:00
}
2023-11-30 00:23:23 +08:00
2023-10-02 23:24:56 +08:00
public void SetGlobalPosition(Vector3 value)
{
globalPosition = value;
}
2023-11-30 00:23:23 +08:00
2023-10-02 23:24:56 +08:00
public void SetGlobalRotation(Quaternion value)
{
globalRotation = value;
}
2023-11-30 00:23:23 +08:00
2023-06-08 14:09:50 +08:00
public void LateUpdate()
{
2023-11-30 00:23:23 +08:00
currentEuler = Vector3.Scale(currentEuler, rotationWeight);
currentPosition = Vector3.Scale(currentPosition, positionWeight);
2023-10-02 23:24:56 +08:00
2023-11-30 00:23:23 +08:00
if (disabledRotation is false)
switch (currentEuler, globalRotation)
{
case var (euler, rotation) when euler.IsDefault() is false && rotation.IsDefault():
transform.localRotation = Quaternion.Euler(euler);
break;
case var (euler, rotation) when euler.IsDefault() && rotation.IsDefault() is false:
transform.rotation = globalRotation = rotation;
break;
case var (euler, rotation) when euler.IsDefault() is false && rotation.IsDefault() is false:
transform.rotation = globalRotation = rotation * Quaternion.Euler(euler);
break;
}
if (disabledPosition is false)
switch (currentPosition, globalPosition)
{
case var (position, global) when position.IsDefault() is false && global.IsDefault():
transform.localPosition = position;
break;
case var (position, global) when position.IsDefault() && global.IsDefault() is false:
transform.position = globalPosition = global;
break;
case var (position, global) when position.IsDefault() is false && global.IsDefault() is false:
transform.position = globalPosition = global + position;
break;
}
2023-10-02 23:24:56 +08:00
currentEuler = Vector3.zero;
currentPosition = Vector3.zero;
2023-06-08 14:09:50 +08:00
}
}
}