80 lines
2.2 KiB
C#
80 lines
2.2 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
public class Oscillogram : MonoBehaviour
|
|
{
|
|
[SerializeField] new ParticleSystem particleSystem;
|
|
[SerializeField] new Rigidbody rigidbody;
|
|
[SerializeField] [Min(0)] [Tooltip("每分钟跳动次数")] int frequency;
|
|
[SerializeField] [Tooltip("跳动时施加的力")] float amplitude;
|
|
[SerializeField] UnityEvent beatEvent;
|
|
|
|
float lastTime;
|
|
bool isRandomizing = true;
|
|
int minFrequency=45;
|
|
int maxFrequency=70;
|
|
float minAmplitude=1000;
|
|
float maxAmplitude=1500;
|
|
|
|
void FixedUpdate()
|
|
{
|
|
particleSystem.Emit(1);
|
|
particleSystem.Simulate(Time.fixedDeltaTime, true, false);
|
|
|
|
if (isRandomizing)
|
|
{
|
|
// 在范围内随机改变频率和振幅
|
|
frequency = Random.Range(minFrequency, maxFrequency);
|
|
amplitude = Random.Range(minAmplitude, maxAmplitude);
|
|
}
|
|
|
|
if (Time.fixedTime - lastTime > 60.0f / frequency)
|
|
{
|
|
beatEvent.Invoke();
|
|
rigidbody.AddForce(Vector3.up * amplitude);
|
|
lastTime = Time.fixedTime;
|
|
}
|
|
}
|
|
|
|
public void SetFrequency(int newFrequency)
|
|
{
|
|
frequency = newFrequency;
|
|
}
|
|
|
|
public void SetAmplitude(float newAmplitude)
|
|
{
|
|
amplitude = newAmplitude;
|
|
}
|
|
|
|
public void ControlHeart(string type)
|
|
{
|
|
isRandomizing = true; // 启用随机化
|
|
|
|
switch (type)
|
|
{
|
|
case "normal":
|
|
minFrequency = 45;
|
|
maxFrequency = 70;
|
|
minAmplitude = 1000f;
|
|
maxAmplitude = 1500f;
|
|
break;
|
|
case "quick":
|
|
minFrequency = 80;
|
|
maxFrequency = 150;
|
|
minAmplitude = 1500f;
|
|
maxAmplitude = 2000f;
|
|
break;
|
|
case "slow":
|
|
minFrequency = 15;
|
|
maxFrequency = 25;
|
|
minAmplitude = 500f;
|
|
maxAmplitude = 700f;
|
|
break;
|
|
default:
|
|
Debug.LogWarning("Unknown heart type: " + type);
|
|
isRandomizing = false; // 取消随机化
|
|
break;
|
|
}
|
|
}
|
|
}
|