AnyPortrait > マニュアル > スクリプトで更新時間を制御
ゲームにはさまざまな演出技法が使われており、代表的な技法は再生速度を調節することです。
ゲーム全体のスピードを速くまたは遅くして緊張感のあるプレイを提供したり、特定のキャラクターのアニメーション速度だけを制御して面白い効果を見せることもできます。
デフォルトでは、UnityのTimeクラスを使用してゲームの速度を調整できます。
ここに加えて、AnyPortraitのキャラクターのアニメーション再生速度をスクリプトで制御できます。
このページでは、アニメーションの再生速度を制御するスクリプトの例を紹介します。
スクリプト関数の説明は、関連ページでも参照できます。
スクリプトの例を示すために、上記のように4つの同じキャラクターを配置しました。
以下のスクリプト例の結果は、ページ下部の動画で見ることができます。
void Update()
{
// Qキーを押すと、ゲームの速度がデフォルト値(1)に戻ります。
if (Input.GetKeyDown(KeyCode.Q))
{
Time.timeScale = 1.0f;
}
// Wキーを押すとゲームのスピードが3倍になります。
if (Input.GetKeyDown(KeyCode.W))
{
Time.timeScale = 3.0f;
}
}
「Time.deltaTime」を利用するすべてのオブジェクトは、ゲームの倍速の影響を受けます。
AnyPortraitで制作されたキャラクターも基本的にゲーム配速の影響を受けます。
下の映像のすべての場合は、それぞれ全体ゲームの倍速が1倍と3倍の時を比較して示しています。
void Update()
{
// (省略)
// Aキーを押すと、倍速オプションがすべて初期化されます。
if (Input.GetKeyDown(KeyCode.A))
{
portraitA.SetUpdateTimeMethod(false);
portraitB.SetUpdateTimeMethod(false);
portraitC.SetUpdateTimeMethod(false);
portraitD.SetUpdateTimeMethod(false);
}
// Sキーを押すと倍率を指定します。
if (Input.GetKeyDown(KeyCode.S))
{
portraitA.SetUpdateTimeMethod(false);
portraitB.SetUpdateTimeMethod(false, 1.5f);
portraitC.SetUpdateTimeMethod(true);
portraitD.SetUpdateTimeMethod(true, 1.5f);
}
}
「SetUpdateTimeMethod(bool useUnscaleDeltaTime, float multiplier)」関数は、ゲーム全体の更新速度に基づいて一定の倍速を乗じてアニメーション速度を決めます。
- bool useUnscaleDeltaTime : デフォルト値「false」と入力すると、「ゲームの倍速(Time.timeScale)」の影響を受けます。 「true」と入力すると、ゲームの倍速の影響を受けません。
- float multiplier : ゲーム全体のアップデート速度に「倍率」を乗じてアップデート時間を決定します。 入力しない場合、1 が乗算されます。
倍速設定をデフォルト値に戻したい場合は、「SetUpdateTimeMethod(false)」で作成してください。
void Update()
{
// (省略)
// Dキーを押すと、コールバック関数で再生速度を決定します。
if (Input.GetKeyDown(KeyCode.D))
{
portraitA.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitA);
portraitB.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitB);
portraitC.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitC);
portraitD.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitD);
}
}
// 各apPortraitの再生速度を返すコールバック関数。
private float OnDeltaTimeRequested(object savedObject)
{
// 保存されたオブジェクトに応じて異なる再生速度を返します。
if (savedObject == (object)portraitA)
{
return Time.deltaTime / 2.0f;
}
else if (savedObject == (object)portraitB)
{
return Time.deltaTime * 3.0f;
}
else if (savedObject == (object)portraitC)
{
return Time.unscaledDeltaTime / 2.0f;
}
else if (savedObject == (object)portraitD)
{
return Time.unscaledDeltaTime * 3.0f;
}
return Time.deltaTime;
}
「SetUpdateTimeMethod(OnDeltaTimeRequested onDeltaTimeRequested, object savedObject)」関数は、より柔軟に再生速度を変更できます。
この関数が呼び出されるフレームのゲーム時間を返すだけで、戻り値を変更して、アニメーションをすばやく再生するように変更できます。
この方法の素晴らしい点は、返されるゲーム時間の値をリアルタイムで変更できることです。
たとえば、ゲームでキャラクターが「動きが遅くなる魔法攻撃」に当たってしまい、一定時間の動作が遅くなることをこの関数を利用して簡単に表現できます。
あるいは、再生速度が徐々に変化することを表現するのも簡単です。
「savedObject」と入力しておくと、上記のようにこの関数がどのキャラクターを対象に呼び出されるのかを区別できます。
「Time.deltaTime」を利用すると、ゲームの倍速の影響を受けることができます。
逆に、「Time.unscaledDeltaTime」を使用すると、ゲームのスピードに影響されないオブジェクトを作成することもできます。
独自のシステムを実装して、Unityの時間とは異なる別々のゲーム速度を実装することも可能です。
上記のそれぞれの場合による再生速度の違いを下の動画で確認してみてください。
参考
apPortraitの更新速度変更関数には、次の制限があります。
- 「Mecanim」を使用する場合は適用されず、この場合はクリップの速度に従います。
- 物理機能には適用されません。