190 lines
5.0 KiB
C#
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;
|
|
}
|
|
} |