C#スクリプトでTime.timeScaleに1より小さい値を入れるとスローモーションにできます。
FPSキャラクターやナビメッシュエージェントをシーンに配置して試してみます。
FPSキャラクターには、元々付いている足音用のAudio Sourceの他に、BGM用のAudio Sourceを追加しました。
前の記事のC#スクリプトを使って、FPSキャラクターがボールを発射できるようにしました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPSScript : MonoBehaviour
{
public GameObject ball;
Rigidbody rb_ball;
public float thrust = 100f;
// Start is called before the first frame update
void Start()
{
audioSources = GetComponents<AudioSource>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
// スローモーションにする
if (Time.timeScale == 1f)
{
Time.timeScale = 0.3f;
}
// 早さをもとに戻す
else
{
Time.timeScale = 1f;
}
}
if (Input.GetMouseButtonDown(0)) // マウスの左クリックをしたとき
{
rb_ball = Instantiate(ball, transform.position, transform.rotation).GetComponent<Rigidbody>(); // 玉を生成
rb_ball.AddForce(transform.forward * thrust, ForceMode.Impulse); // カーソルの方向に力を一度加える
}
}
}
Eキーを押すたびに、スローモーションと元の早さを行き来します。BGMはこちら
このままでは、スローモーションにしても、アニメーションやナビメッシュエージェントの移動速度、物理演算で飛んでいくボールなどは早さが変わりますが、音声や、TPSキャラクターのマテリアルに設定したシェーダーグラフによって登る線の早さなどは変わらないようです。
音声のスピードはAudio Sourceの「Pitch」で変えられます。
また、シェーダーグラフで表示する輪の早さは、Timeノードに掛け合わせる値で変更できます。
このノードをBlackboardに追加して、インスペクタやスクリプトから変更できるようにします。
スクリプトを変更して、Audio Sourceとメッシュレンダラーを取得して、Time.timeScaleと同時に、これらの値も変更します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FPSScript : MonoBehaviour
{
public GameObject ball;
Rigidbody rb_ball;
public float thrust = 100f;
[SerializeField] AudioSource[] audioSources;
[SerializeField] SkinnedMeshRenderer[] agentMeshRenderers;
// Start is called before the first frame update
void Start()
{
audioSources = GetComponents<AudioSource>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.E))
{
// スローモーションにする
if (Time.timeScale == 1f)
{
Time.timeScale = 0.3f;
foreach (AudioSource a in audioSources)
{
a.pitch = 0.3f;
}
foreach (SkinnedMeshRenderer s in agentMeshRenderers)
{
s.material.SetFloat("_LineSpeed", 0.6f);
}
}
// 早さをもとに戻す
else
{
Time.timeScale = 1f;
foreach (AudioSource a in audioSources)
{
a.pitch = 1f;
}
foreach (SkinnedMeshRenderer s in agentMeshRenderers)
{
s.material.SetFloat("_LineSpeed", 2f);
}
}
}
if (Input.GetMouseButtonDown(0)) // マウスの左クリックをしたとき
{
rb_ball = Instantiate(ball, transform.position, transform.rotation).GetComponent<Rigidbody>(); // 玉を生成
rb_ball.AddForce(transform.forward * thrust, ForceMode.Impulse); // カーソルの方向に力を一度加える
}
}
}
これで音声やシェーダーもスローモーションになりました。
ww