【Unity】C#でスローモーションに切り替える

投稿者: | 2020-04-23

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); // カーソルの方向に力を一度加える
        }
    }
}

これで音声やシェーダーもスローモーションになりました。

【Unity】C#でスローモーションに切り替える」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。