Files
Fishing2/Packages/com.waveharmonic.crest/Shared/Scripts/RandomMotion.cs
2026-01-31 00:32:49 +08:00

100 lines
2.9 KiB
C#

// Crest Water System
// Copyright © 2024 Wave Harmonic. All rights reserved.
using UnityEngine;
namespace WaveHarmonic.Crest.Examples
{
/// <summary>
/// Shoves the gameobject around random amounts, occasionally useful for debugging where some motion is required to reproduce an issue.
/// </summary>
#if !CREST_DEBUG
[AddComponentMenu("")]
#endif
sealed class RandomMotion : MonoBehaviour
{
[SerializeField, HideInInspector]
#pragma warning disable 414
int _Version = 0;
#pragma warning restore 414
[SerializeField]
bool _WorldSpace;
[Header("Translation")]
[SerializeField]
Vector3 _Axis = Vector3.up;
[@Range(0, 15)]
[SerializeField]
float _Amplitude = 1f;
[@Range(0, 5)]
[SerializeField]
float _Frequency = 1f;
[@Range(0, 1)]
[SerializeField]
float _OrthogonalMotion = 0f;
[Header("Rotation")]
[@Range(0, 5)]
[SerializeField]
float _RotationFrequency = 1f;
[SerializeField]
float _RotationVelocity = 0f;
Vector3 _Origin;
Vector3 _OrthogonalAxis;
void Start()
{
_Origin = _WorldSpace ? transform.position : transform.localPosition;
_OrthogonalAxis = Quaternion.AngleAxis(90f, Vector3.up) * _Axis;
}
void Update()
{
// Translation
{
// Do circles in perlin noise
var rnd = 2f * (Mathf.PerlinNoise(0.5f + 0.5f * Mathf.Cos(_Frequency * Time.time), 0.5f + 0.5f * Mathf.Sin(_Frequency * Time.time)) - 0.5f);
// Prevent jump at start.
var amplitude = Mathf.Min(_Amplitude, _Amplitude * Time.timeSinceLevelLoad);
var orthoPhaseOff = Mathf.PI / 2f;
var rndOrtho = 2f * (Mathf.PerlinNoise(0.5f + 0.5f * Mathf.Cos(_Frequency * Time.time + orthoPhaseOff), 0.5f + 0.5f * Mathf.Sin(_Frequency * Time.time + orthoPhaseOff)) - 0.5f);
var position = _Origin + (_Axis * rnd + _OrthogonalMotion * rndOrtho * _OrthogonalAxis) * amplitude;
if (_WorldSpace)
{
transform.position = position;
}
else
{
transform.localPosition = position;
}
}
// Rotation
{
var f1 = Mathf.Sin(Time.time * _RotationFrequency * 1.0f);
var f2 = Mathf.Sin(Time.time * _RotationFrequency * 0.83f);
var f3 = Mathf.Sin(Time.time * _RotationFrequency * 1.14f);
transform.rotation *= Quaternion.Euler(
f1 * _RotationVelocity * Time.deltaTime,
f2 * _RotationVelocity * Time.deltaTime,
f3 * _RotationVelocity * Time.deltaTime);
}
}
}
}