【Unity】設定メモ20250425

# まとめリンク
[Unity関連](https://qiita.com/o_chan_t/items/0b5ae1e7c45f106082b8)
[AtCoder関連](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

# 【Unity(2021)】ビューが開かれたときに何かしたい

## 空のGameObjectを作成
1. ヒエラルキーで右クリック → `Create Empty`  
   名前を「SplashView」に変更

## C#スクリプトの作成・アタッチ
1. プロジェクトビューで右クリック → `Create > C# Script`  
   名前を「ViewOpenEvent」にする
2. 作成した「ViewOpenEvent」スクリプトを `ViewOpenEvent` にドラッグ＆ドロップ

---

## C#コード

**「ビューが開かれたときに何かしたい」**＝**オブジェクトが有効化されたときに何かする**  
→ Unityでは `OnEnable()` または `Start()` を使う。

```csharp
using UnityEngine;

public class ViewOpenEvent : MonoBehaviour
{
    // この関数はオブジェクトが有効化されたときに呼ばれます
    void OnEnable()
    {
        Debug.Log("ビュー（ViewOpenEvent）が開かれました！");
    }
}
```

---

## 動作確認

1. Unityエディタで「ViewOpenEvent」GameObjectのチェックボックスをオン/オフを行う。

![WS001642802_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/cb920705-985a-44ae-88cd-49ead0250a96.jpeg)



2. コンソールに `ビュー（ViewOpenEvent）が開かれました！` と表示される。

![WS001642801.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/c2574138-42c9-4e31-81f1-91e8db693b98.jpeg)

---


# 【Unity(2021)】一定時間待ってから別の画面に遷移したい
## 1. シーンを2つ作成

1. **File > New Scene**でシーンを2つ作成し、名前をそれぞれ  
   - `SplashScene`（スプラッシュやロゴ表示用）  
   - `MainScene`（遷移先）  
   にする。

2. **File > Save As...** でそれぞれ保存する。

### 2. シーンをビルド設定に追加

- メニューから `File > Build Settings...` を開き、`Add Open Scenes` ボタンで両方のシーンを追加する。  
  ※ `SplashScene` を上（Index 0）、`MainScene` を下（Index 1）に並べておく。

![WS001642835.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/ee6d2ea4-fe15-41fb-95dc-0dcc13593fde.jpeg)


### 3. 遷移用オブジェクトの作成

- `SplashScene` を開き、`Hierarchy`で右クリック → `Create Empty` で空のGameObjectを作成し、名前を `SceneAutoSwitcher` にする。

---

## C#スクリプト例

### 1. スクリプト作成

`Assets`フォルダに`SceneAutoSwitcher.cs`という名前で新規C#スクリプトを作成し、以下の内容にします。

```csharp
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneAutoSwitcher : MonoBehaviour
{
    [Tooltip("遷移までの待機秒数")]
    public float waitSeconds = 2f;

    void Start()
    {
        // コルーチンで指定秒数待ってからシーン遷移
        StartCoroutine(WaitAndSwitchScene());
    }

    System.Collections.IEnumerator WaitAndSwitchScene()
    {
        yield return new WaitForSeconds(waitSeconds);
        // Build SettingsでIndex 1のシーンへ遷移
        SceneManager.LoadScene(1);
    }
}
```

### 2. スクリプトのアタッチ

- `SplashScene`の`SceneAutoSwitcher`オブジェクトにこのスクリプトをアタッチします。
- Inspectorで`Wait Seconds`を好きな秒数に設定できます（デフォルト2秒）。

---

上動画のように2秒後に画面が変化する。
イベントトリガーでフェードアウト使いながらであれば、画面遷移に結構利用できそうですね。

<iframe width="560" height="315" src="https://www.youtube.com/embed/CGtQd-pu3f0?si=mb_M-cE8m-SWoQXz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


# 【Unity(2021)】GameObjectリストを一定間隔で順番に表示する

## C#スクリプト例

### 1. スクリプト作成

`Assets`フォルダに`LoopButtons.cs`という名前で新規C#スクリプトを作成し、以下の内容にします。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoopButtons : MonoBehaviour
{
    //! Viewのリスト.
    [SerializeField] List<GameObject> viewList = new List<GameObject>();

    void Start()
    {
        // 最初のViewを表示
        Test_ChangeView(0);
        // コルーチン開始
        StartCoroutine(ChangeViewLoop());
    }

    // ------------------------------------------------
    /// View移動処理.
    // ------------------------------------------------
    public void Test_ChangeView(int index)
    {
        for (int i = 0; i < viewList.Count; i++)
        {
            viewList[i].SetActive(i == index);
        }
    }

    // ------------------------------------------------
    /// 1秒ごとにViewを切り替えてループ.
    // ------------------------------------------------
    IEnumerator ChangeViewLoop()
    {
        int index = 0;
        while (true)
        {
            Test_ChangeView(index);
            index = (index + 1) % viewList.Count; // 0～Count-1でループ
            yield return new WaitForSeconds(1f);
        }
    }
}

```

<iframe width="560" height="315" src="https://www.youtube.com/embed/re7xl3KCPC4?si=X7P1PVtrWBgzC6yq" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 【Unity(2022)】[DOTween]UIオブジェクトを滑らかに消す方法：右スライド＋アルファフェード＋縮小アニメーションの統合

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class UITransition : MonoBehaviour
{
    public RectTransform Rect
    {
        get
        {
            if (rect == null) rect = GetComponent<RectTransform>();
            return rect;
        }
    }
    RectTransform rect = null;

    // CanvasGroupの参照
    CanvasGroup canvasGroup;

    void Awake()
    {
        // CanvasGroupを取得または追加
        canvasGroup = GetComponent<CanvasGroup>();
        if (canvasGroup == null)
        {
            canvasGroup = gameObject.AddComponent<CanvasGroup>();
        }
    }

    void Start()
    {
        TransitionOut();
    }


    //! アウトのシークエンス.
    Sequence outSequence = null;
    // ----------------------------------------------------
    // トランジションアウト.
    // ----------------------------------------------------
    public void TransitionOut()
    {
        // 既存のアニメーションを停止
        if (outSequence != null)
        {
            outSequence.Kill();
            outSequence = null;
        }

        outSequence = DOTween.Sequence();

        // フェードアウト
        if (canvasGroup != null)
        {
            canvasGroup.alpha = 1f;
            outSequence.Join(
                canvasGroup.DOFade(0, 3f)
                    .SetEase(Ease.OutQuad) // イージング追加
            );
        }

        // 右方向への移動（250px）
        outSequence.Join(
            Rect.DOLocalMoveX(250f, 3f)
                .SetEase(Ease.InOutSine)
        );

        // スケールダウン（0.25倍）
        outSequence.Join(
            Rect.DOScale(0.25f, 3f)
                .SetEase(Ease.OutBack)
        );

        // アニメーション終了時のコールバック
        outSequence.OnComplete(() => {
            Debug.Log("Transition完了");
            gameObject.SetActive(false); // 非アクティブ化
        });

        outSequence.SetLink(gameObject);
    }

}
```


<iframe width="560" height="315" src="https://www.youtube.com/embed/yzN7f3V7Zrw?si=fcc1qxnKeJvlXvAm&amp;start=1" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>