前提・実現したいこと
addForceでの移動制限(画面外への移動不可)はどういった処理で実装できますか?
検索してもなかなか記事が見つからなかったです。
望ましいのは移動前に、addForceの移動後を計算して制御することですが、
おそらくそれは不可能と考えていて(可能でしたら教えていただきたいです)、
移動後に制御するしかないと思っています。
また、スクリプトでの制御法を知りたいです(オブジェクト配置での移動制限は考えていません)。
ご教示お願いします。
該当のソースコード
カメラのローカル軸の向きがワールド軸の向きと一致していなくて、
ゲームオブジェクトのローカル軸の向きもワールドと一致していない、
かつカメラのローカル軸とも一致していない想定です。
ここで、ゲームオブジェクトが例えば、addRelativeForceでゲームオブジェクトのローカル軸のX方向に動く場合、
画面外への移動を不可にしたいです。
試したこと
Rigidbodyの動き、画面の境界の取得は考えることができました。
もし、画面の境界の取得が間違っていたらご指摘ください。
thisがRigidbodyで動かすゲームオブジェクトです。
カメラは動くRigidbodyを追いかけることを想定しているので、常に画面の境界を更新しています。
C#
1 void FixedUpdate() 2 { 3 4 float x = Input.GetAxis("Horizontal"); 5 float y = Input.GetAxis("Vertical"); 6 7 rigidbody.AddRelativeForce(x * Time.deltaTime * speed, y * Time.deltaTime * speed, 0); 8 9 Vector3 viewport = Camera.main.WorldToViewportPoint(this.transform.position); 10 Vector3 viewMin = new Vector3(0.0f, 0.0f,viewport.z); 11 Vector3 viewMax = new Vector3(1.0f, 1.0f,viewport.z); 12 Vector3 worldMin = Camera.main.ViewportToWorldPoint(viewMin); 13 Vector3 worldMax = Camera.main.ViewportToWorldPoint(viewMax)
追記
加速度0のコードのはず。
C#
1 void FixedUpdate() 2 { 3 4 float x = Input.GetAxis("Horizontal"); 5 float y = Input.GetAxis("Vertical"); 6 7 rigidbody.velocity = new Vector3(x*speed, 0, 0); 8 9 if(rigidbody.velocity.magnitude > 0){ 10 Debug.Log("-----"); 11 Debug.Log("Time.deltaTime:"+Time.deltaTime); 12 Debug.Log("位置:"+ this.transform.position.ToString("G")); 13 Debug.Log("算出:"+ (this.transform.position + rigidbody.velocity * Time.deltaTime).ToString("G")); 14 }
追記2
加速度あり
C#
1 2 void FixedUpdate() 3 { 4 5 float x = Input.GetAxis("Horizontal"); 6 float y = Input.GetAxis("Vertical"); 7 8 Vector3 force = new Vector3(x * speed, y * speed, 0); 9 Vector3 relativeforce = this.transform.TransformDirection(force); 10 Vector3 acc = relativeforce/rigidbody.mass; 11 rigidbody.AddRelativeForce(force); 12 13 if(rigidbody.velocity.magnitude > 0){ 14 Debug.Log("-----"); 15 Debug.Log("位置:"+ this.transform.position.ToString("G")); 16 Debug.Log("算出:"+ (this.transform.position + rigidbody.velocity*Time.deltaTime + 1f/2f*acc*Time.deltaTime*Time.deltaTime).ToString("G")); 17 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/07/29 14:09
2019/07/30 01:03
退会済みユーザー
2019/07/31 14:06
2019/08/01 01:40 編集
退会済みユーザー
2019/08/01 13:51 編集
2019/08/01 15:21
退会済みユーザー
2019/08/02 14:42
2019/08/02 15:31
退会済みユーザー
2019/08/03 03:05