# Unity moving box/Oscillator gpt解釋版本 Sin(tau * cycles) ```C#= using UnityEngine; public class Oscillator : MonoBehaviour { public Vector3 direction = Vector3.right; // 振荡器的运动方向 public float frequency = 1f; // 振荡器的频率 public float amplitude = 1f; // 振荡器的振幅 private Vector3 startingPos; // 振荡器的起始位置 void Start() { startingPos = transform.position; // 记录振荡器的起始位置 } void Update() { float t = Time.time * frequency; // 根据时间和频率计算一个t值 Vector3 offset = direction * Mathf.Sin(t) * amplitude; // 计算振荡器的偏移量 transform.position = startingPos + offset; // 将振荡器移动到新的位置 } } //chat gpt ``` 教學的寫法 Mathf.Sin(cycles * tau) tau=1/2 Pi float容易有誤差,不太精準,unity中最小的float是Mathf.Epsilon 需要條件判斷時,會比使用0好 Q:為什麼需要保護小於0的或是非常小的範圍? A:阿不然會出錯 Nan ```C#= public class oscillitor : MonoBehaviour { Vector3 StartPosition; [SerializeField] Vector3 movementVector; [SerializeField] [Range(0,1)] float movementFactor; [SerializeField] float period = 2f; void Start() { StartPosition = transform.position; Debug.Log(StartPosition); } // Update is called once per frame void Update() { //Protect 0 period if(period>Mathf.Epsilon) { float cycles = Time.time / period;//continueally growing over time const float tau = Mathf.PI * 2;// constant value of 6.283 float rawSinWave = Mathf.Sin(cycles * tau);// going from-1 to 1 Debug.Log(rawSinWave); movementFactor = (rawSinWave + 1f) / 2f;//recalculated from 0 to 1 so its cleanner Vector3 offset = movementVector * movementFactor; transform.position = StartPosition + offset; } else { return; } } } ``` #### 忘記的物理知識 GPT: ##### 在計算正弦函數時,輸入參數與輸出值的關系是根據三角函數的性質確定的。對於任何一個角度x,sin(x)的輸出值都是在-1到1之間的。在Unity中,Mathf.Sin函數的輸入參數是弧度,而不是角度。因此,如果我們要計算以周期為tau的正弦函數在周期內的值,可以使用下面兩種方式之一: ##### Mathf.Sin(cycles * tau):其中cycles表示時間的流逝,表示在周期內經過的時間比例,範圍在0到1之間。由於周期為tau,因此cycles * tau的值將從0到2π循環。通過這個值作為輸入,Mathf.Sin函數可以計算出正弦函數在周期內的值,並返回一個在-1到1之間的浮點數。 ##### Mathf.Sin(tau * cycles):這種方式與第一種方式非常相似,只是輸入參數的順序不同。在這種情況下,tau * cycles的值也將從0到2π循環。由於正弦函數是一個偶函數,即sin(-x) = -sin(x),因此在這種情況下,輸出值與第一種方式相同,都是一個在-1到1之間的浮點數。 ##### 因此,Mathf.Sin(cycles * tau)和Mathf.Sin(tau * cycles)在結果上是等效的。 ###### tags: `unity`
{"metaMigratedAt":"2023-06-18T00:08:50.614Z","metaMigratedFrom":"Content","title":"Unity moving box/Oscillator","breaks":true,"contributors":"[{\"id\":\"9be48535-8f15-404d-8fdb-b01990d37456\",\"add\":3150,\"del\":805}]"}
Expand menu