1

Rigidbody2D を一時停止して再開する方法を知りたいです。さまざまな方法を試しましたが、どれも機能しませんでした。主な問題は、ゲームが一時停止すると、rigidbody2D が移動するため、rigidbody2D を一時停止できる必要があり、一時停止を解除すると、rigidbody2D は以前と同じように移動し続ける必要があることだと思います。

これは私がこれまでに持っているコードです:

using UnityEngine;
using System.Collections;

public class Pause : MonoBehaviour {


    private Rigidbody _rigidBody;
    void Awake () 
    {
        _rigidBody = Ball.GetComponent<Rigidbody>();
    }

    private Vector3 _pausedVelocity;
    private Vector3 _pausedAngularVelocity;

    public void OnMouseEnter() 
    {
        Debug.Log("Pause with velocity=" + _rigidBody.velocity + " & angularVelocity=" + _rigidBody.angularVelocity);
        _pausedVelocity = _rigidBody.velocity;
        _pausedAngularVelocity = _rigidBody.angularVelocity;
        _rigidBody.isKinematic = true;
    }

    public void OnMouseExit() 
    {
        _rigidBody.isKinematic = false;
        _rigidBody.velocity = _pausedVelocity;
        _rigidBody.angularVelocity = _pausedAngularVelocity;
        Debug.Log("Resume with velocity=" + _rigidBody.velocity + " & angularVelocity=" + _rigidBody.angularVelocity);
    }
}

基本的に、このコードは、collision2D コンポーネントを使用して empty にアタッチされ、マウスがその上に置かれると一時停止が出力され、マウスが離れると再生が出力されます。すべてが機能するようにするには、rigidbody2D を一時停止する方法を理解する必要があります。

前もって感謝します!

4

1 に答える 1

3

すべてのゲームオブジェクトを一時停止したい場合は、Time.timeScaleを 0に設定するだけです

1 つのゲームオブジェクトだけを一時停止する場合は、一時停止時に速度と角速度を保存し、Rigidbody.isKinematicを true に設定し、再開時に元の値を復元します。

public class PausableRigidbody : MonoBehaviour {

    private Rigidbody _rigidBody;
    void Awake () 
    {
        _rigidBody = this.GetComponent<Rigidbody>();
    }

    private Vector3 _pausedVelocity;
    private Vector3 _pausedAngularVelocity;

    public void Pause() 
    {
        Debug.Log("Pause with velocity=" + _rigidBody.velocity + " & angularVelocity=" + _rigidBody.angularVelocity);
        _pausedVelocity = _rigidBody.velocity;
        _pausedAngularVelocity = _rigidBody.angularVelocity;
        _rigidBody.isKinematic = true;
    }

    public void Resume() 
    {
        _rigidBody.isKinematic = false;
        _rigidBody.velocity = _pausedVelocity;
        _rigidBody.angularVelocity = _pausedAngularVelocity;
        Debug.Log("Resume with velocity=" + _rigidBody.velocity + " & angularVelocity=" + _rigidBody.angularVelocity);
    }
}

更新 1

インスタンスは、 SerializeFieldPausableRigidbodyの参照によって呼び出すことができます。これは、Unity インスペクターでを選択し、スクリプトを含むボールをインスペクターにドラッグすることで入力できます。次のようになります。PausingViewPausableRigidbody

Unity エディター PausingView とシリアライズされたフィールド PausableRigidbody

public class PausingView : MonoBehaviour {

    [SerializeField]
    private PausableRigidbody _pausableRigidbody;

    public void OnMouseEnter() 
    {
        _pausableRigidbody.Pause();
    }

    public void OnMouseExit() 
    {
        _pausableRigidbody.Resume();
    }
}
于 2015-09-01T06:47:03.963 に答える