ro-webgl/Assets/ArtScript/AroundSphereMove.cs
2021-12-21 09:40:39 +08:00

190 lines
5.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
public class AroundSphereMove : MonoBehaviour
{
[SerializeField]
private Vector3 m_ShakeDir = Vector3.zero;
[SerializeField]
private float m_ShakeSpeed = 0f;
[SerializeField]
private float m_MoveRadius = 0f;
[SerializeField]
private float m_MoveAngleSpeed = 0f;
[SerializeField]
private float m_SelfRotateSpeed = 0f;
[SerializeField]
private Quaternion m_OffsetAngle = Quaternion.identity; //初始角度
[SerializeField]
private float m_SelfScale = 1; //初始大小
[SerializeField]
private float m_SelfHeight = 0; //初始高度偏移
public Vector3 shakeDir
{
get { return m_ShakeDir; }
set
{
if (m_ShakeDir == value) return;
m_ShakeDir = value;
}
}
public float shakeSpeed
{
get { return m_ShakeSpeed; }
set
{
if (m_ShakeSpeed == value) return;
m_ShakeSpeed = value;
}
}
public float moveRadius
{
get { return m_MoveRadius; }
set
{
if (m_MoveRadius == value) return;
m_MoveRadius = value;
m_NeedReset = true;
}
}
public float moveAngleSpeed
{
get { return m_MoveAngleSpeed; }
set
{
if (m_MoveAngleSpeed == value) return;
m_MoveAngleSpeed = value;
}
}
public float selfRotateSpeed
{
get { return m_SelfRotateSpeed; }
set
{
if (m_SelfRotateSpeed == value) return;
m_SelfRotateSpeed = value;
m_NeedReset = true;
}
}
public float OffsetHeight
{
get { return m_SelfHeight; }
set
{
if (m_SelfHeight == value) return;
m_SelfHeight = value;
}
}
public float Scale
{
get { return m_SelfScale; }
set
{
if (m_SelfScale == value) return;
m_SelfScale = value;
m_NeedReset = true;
}
}
public Quaternion OffsetAngle
{
get { return m_OffsetAngle; }
set
{
if (m_OffsetAngle == value) return;
m_OffsetAngle = value;
m_NeedReset = true;
}
}
private bool m_NeedReset = true;
private float m_Angle = 0f;
private Transform m_Transform;
private Transform m_ParentTransform;
private Vector3 m_StartPos;
private Vector3 m_EndPos;
private float m_ShakeOffset = 0;
private int m_ShakeSign = 1;
private float m_MoveAngleOffset = 0f;
private void Awake()
{
m_Transform = transform;
}
private void OnDestroy()
{
}
private void Update()
{
if (m_NeedReset)
{
m_NeedReset = false;
ResetTransform();
}
float deltaTime = Time.deltaTime;
Vector3 pos = Vector3.zero;
if (!Mathf.Approximately(m_ShakeSpeed, 0f) && m_ShakeDir != Vector3.zero)
{
m_ShakeOffset = m_ShakeOffset + m_ShakeSign * deltaTime * m_ShakeSpeed;
if (m_ShakeOffset >= 1)
{
m_ShakeOffset = 1;
m_ShakeSign = -m_ShakeSign;
}
else if (m_ShakeOffset <= -1)
{
m_ShakeOffset = -1;
m_ShakeSign = -m_ShakeSign;
}
pos = Vector3.LerpUnclamped(Vector3.zero, m_ShakeDir, m_ShakeOffset);
}
if (m_MoveRadius > 0f && !Mathf.Approximately(m_MoveAngleSpeed, 0f))
{
m_MoveAngleOffset = m_MoveAngleOffset + deltaTime * m_MoveAngleSpeed;
pos = pos + Vector3.SlerpUnclamped(m_StartPos, m_EndPos, m_MoveAngleOffset);
}
if (!Mathf.Approximately(m_SelfRotateSpeed, 0))
{
m_Angle = m_Angle + deltaTime * m_SelfRotateSpeed;
m_Transform.rotation = m_OffsetAngle * Quaternion.Euler(0, m_Angle, 0);
}
if (m_ParentTransform)
pos = pos + m_ParentTransform.position;
m_Transform.position = pos + Vector3.up * m_SelfHeight;
}
void ResetTransform()
{
Vector3 pos = Vector3.zero;
if (m_MoveRadius > 0)
{
Vector3 forward = Vector3.forward;
m_StartPos = forward * m_MoveRadius;
m_EndPos = -m_StartPos;
pos = m_StartPos;
}
m_Transform.localScale = Vector3.one * m_SelfScale;
m_ParentTransform = m_Transform.parent;
if (m_ParentTransform)
pos = pos + m_ParentTransform.position;
m_Transform.position = pos + Vector3.up * m_SelfHeight;
m_Transform.rotation = m_OffsetAngle;
m_Angle = 0f;
}
}