時を操るアセット「Chronos」の基本的な使い方

#この記事について
この記事は[**Unityアセット真夏のアドベントカレンダー 2019 Summer!**](http://assetstore.info/eventandcontest/adventcalendar/eventandcontestadventcalendarasset-adventcalendar2019summer/)31日目の記事です。

#「[Chronos](https://assetstore.unity.com/packages/tools/particles-effects/chronos-31225?aid=1101lGx2&utm_source=aff?utm_source=jppt&utm_medium=20190831)」とは？
[LIDIQ](https://assetstore.unity.com/publishers/11548)氏が[AssetStore](https://assetstore.unity.com/)にて製作、販売をしている、
あらゆるオブジェクトの時間を操れるアセットです。
###[Chronos Time Control](https://assetstore.unity.com/packages/tools/particles-effects/chronos-31225?aid=1101lGx2&utm_source=aff?utm_source=jppt&utm_medium=20190831)
##どのように操れるか
![698F7890-57F3-4626-90AF-2676F33008DE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/df5e7daa-da11-002a-864b-89f543ad55cf.jpeg)
時間を遅くしたり止めたり、加速させたり戻したり…
時間の調整が細かく出来ます。
##時間操作の影響を受ける対象
![B486C5DC-5918-4CA7-8BB3-4ECF2E8652A8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/a2525052-a792-02da-35bb-19854c70a8fe.jpeg)
一括で管理したり、いくつかのグループに分けて管理したり、1つずつ管理したり、範囲(エリア)内のオブジェクトのみを管理したり…
カスタマイズ性が高いのも特徴です。

どのような挙動をするかは[こちら](https://www.youtube.com/watch?v=-zq1OZuGXoc)の動画をご覧下さい。
#基本的な使い方
それでは、使い方に移っていきます。
まず、Chronosの時間操作を扱うためにはシーン上に「[Timekeeper](https://ludiq.io/chronos/api/timekeeper)」というコンポーネントを持つオブジェクトが必要です。
なのでまずはそれを追加してみましょう！
(既にプロジェクトを作成し、Chronosを購入、インポートしている前提で進めていきますので、まだの方は先にインポートまで終わらせておいてください)
![948E3FC0-A7CE-47A0-A5AD-FA4B883A656E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/a32934fd-3b2e-bd24-8eb1-0a07930d78a2.jpeg)
Hierarchyビュー上で右クリックします。
![C2887818-BB62-444B-8397-4CE0E98CD2A4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/10d1e166-8961-1607-354f-aa962552056f.jpeg)
下にある「[Timekeeper](https://ludiq.io/chronos/api/timekeeper)」をクリック
![4BA1BE48-66B7-453D-B9CF-756D6357C324.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/24cc15af-0ed7-6716-0b4f-59576a60f8cc.jpeg)
これで、Chronosを使う準備が出来ました。
#時間操作
それでは時間を操作していきます。
時間を操作したいオブジェクトに、「[Localclock](https://ludiq.io/chronos/api/localclock)」と、「[Timeline](https://ludiq.io/chronos/api/timeline)」というコンポーネントを追加します。
![96507DB2-DA6F-4211-B763-2B511F673811.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/712f5e9d-9922-6283-eab2-9628426a0b7b.jpeg)
Addcomponentをクリックして(今回は物理演算を適用するためRigidbodyも追加しています)
![78DF7EC0-A709-48C8-8A3C-230D2D274E86.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/ba35ff9c-b7ed-6fbe-663d-f1a40d9c647a.jpeg)
「[Localclock](https://ludiq.io/chronos/api/localclock)」を追加。
![AEBDD9B3-006B-444E-9581-1A734487C600.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/10b540d2-0895-2f89-4dce-8df544a5bcf2.jpeg)
続いて同じ方法で「[Timeline](https://ludiq.io/chronos/api/timeline)」も追加します。
これで時間操作を適用させる準備が出来ました。
時間を操作するためにスクリプトを書いていきます。
![1F02B07B-4CF2-4BEA-98AE-89CFF64F3553.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/76844381-27ec-fdfc-34cb-e832062f88ee.jpeg)
Projectビュー上で右クリックし、createからC#Scriptを押します
スクリプト名を適当に決め(私はTimeControlsしました)そのスクリプトファイルを開きます。

```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Chronos;

public class TimeControl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GetComponent<LocalClock>().localTimeScale = 0.01f;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```

このコードを書き、時間操作をしたいオブジェクトに適用することで時間を遅くする(100分の1)にすることができます。
コードの解説をしますと
```
GetComponent<LocalClock>()
```
まずオブジェクトが持つ「[Localclock](https://ludiq.io/chronos/api/localclock)」を取得し
```
localTimeScale = 0.01f;
```
その時間を0.01倍速にしています。
この0.01の部分を変えれば任意の速度に変更できます。

次にこれをオブジェクト単位ではなく、一括で変更できるようにしていきましょう。
まず親にしたいオブジェクトに「[GlobalClock](https://ludiq.io/chronos/api/globalclock)」を追加しますが、Timekeeperに既についているので、Timekeeper以外を親にしたい場合以外は追加する必要はありません。
それでは「[GlobalClock](https://ludiq.io/chronos/api/globalclock)」と「[LocalClock](https://ludiq.io/chronos/api/localclock)」を関連付けしていきます。
![861DCC69-6500-4D05-92A0-0796547BD4BC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/4ec34756-1b4e-630c-dfec-2bd3ff94b1ee.jpeg)
「[GlobalClock](https://ludiq.io/chronos/api/globalclock)」のKeyの部分の名前を覚えておきます。
![554A0270-4BE0-4F6E-A467-C998DED62FCD.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/46a6f656-b619-0099-e7ec-5e06d8a55f91.jpeg)
そして「[Timeline](https://ludiq.io/chronos/api/timeline)」のModeをLocalからGlobalに変えます。
![DEF28745-300C-49C3-B40C-C59B578EE654.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460745/873f1f1e-c898-78dd-8de6-a8417019dccf.jpeg)
最後に「[Timeline](https://ludiq.io/chronos/api/timeline)」のGlobalClockを先程のKeyの名前を選択して、完了です。
これをまとめて動かしたいオブジェクトの数だけ行ってください。

それでは先程のコードを改変して、Tキーを押した時に全体の時間を止め、もう一度Tキーを押すと時間が元に戻るコードを書いていきます。

```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Chronos;

public class TimeControl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.T))
        {
            if (GetComponent<GlobalClock>().localTimeScale == 0)
                GetComponent<GlobalClock>().localTimeScale = 1;
            else
                GetComponent<GlobalClock>().localTimeScale = 0;
        }
    }
}
```
このコードを「[GlobalClock](https://ludiq.io/chronos/api/globalclock)」を持つオブジェクトに適用します。
そしてゲームを初めTキーを押してみると…？
一度押すと止まり、もう一度押すと動いたと思います。
最後にコードの解説をしますと

``` if (Input.GetKeyDown(KeyCode.T))
        {
```の部分で「もし、Tキーが押されたなら〜」という条件式を作り

`if (GetComponent<GlobalClock>().localTimeScale == 0)
GetComponent<GlobalClock>().localTimeScale = 1
`の部分で「既に時間が止まっているなら〜」という条件式をさらに作り
その下の文で時間を等倍にする処理をしています。
つまり「時間が既に止まっているな時間を等倍にする」という処理をここで行っています。

`else
                GetComponent<GlobalClock>().localTimeScale = 0;
`
この文で「時間が止まっていないなら」という先程の条件式の反対の状況になっていれば処理し時間を止めます。
ここで「時間が止まっていないなら時間を止める」という処理です。

#最後に
Chronosではここで紹介した以外にもまだまだ使い方があります！
是非Chronosをマスターして時間を自在に操ってみてください！