---
# System prepended metadata

title: Unity moving box/Oscillator
tags: [unity]

---

# 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`