前提・実現したいこと
transform系での移動は、Mathf.Clampを使えば移動制限できるみたいですが、
velocityでの移動はどのように制御すれば移動制限できるのでしょうか?
ご教示お願いします。
該当のソースコード
C#
1 void FixedUpdate(){ 2 rb.velocity = this.transform.right * speed; 3 }
試したこと
transform系での移動は、こちらのサイトのように、
Mathf.Clampを使えば移動制限できることがわかりました。
C#
1 // 移動量を加える 2 pos += direction * spaceship.speed * Time.deltaTime; 3 4 // プレイヤーの位置が画面内に収まるように制限をかける 5 pos.x = Mathf.Clamp (pos.x, min.x, max.x); 6 pos.y = Mathf.Clamp (pos.y, min.y, max.y);
velocityの場合でも、Mathf.Clampを使って移動制限できるのでしょうか?
可能であれば、Mathf.Clampを使った移動制限を知りたいですが、
不可能であれば、velocityでの次の到達点が指定範囲内ならば、
移動するといった制御にしたいです。
C#
1 void FixedUpdate(){ 2 if(velocityでの次の到達点<max.x){ 3 rb.velocity = this.transform.right * speed; 4 } 5 }
妥協案として、「移動前に制限」ではなく、「移動後に調整して制限」を考えてみたのですが、
下記のコードでも、移動制限されませんでした。
下記コードが意図通りにいかない理由もわかりませんが、できればこのようなコードではなく、
「移動前に制限」させたいです。
C#
1 void FixedUpdate(){ 2 rb.velocity = this.transform.right * speed; 3 if(this.transform.position.x > max.x){ 4 Vector3 limit = new Vector3(max.x, this.transform.position.y, this.transform.position.z); 5 this.transform.position = limit; 6 } 7 }
追記。
C#
1 void Update () { 2 Vector3 viewport = Camera.main.WorldToViewportPoint(this.transform.position); 3 Vector3 viewmin = new Vector3(0.0f, 0.0f,viewport.z); 4 Vector3 viewmax = new Vector3(1.0f, 1.0f,viewport.z); 5 min = Camera.main.ViewportToWorldPoint(viewmin); 6 max = Camera.main.ViewportToWorldPoint(viewmax); 7 8 } 9 10 void FixedUpdate(){ 11 12 Vector3 pos = this.transform.position + (this.transform.right * speed); 13 pos.x = Mathf.Clamp(pos.x, min.x, max.x); 14 15 rb.velocity = pos - this.transform.position;
### 追記②
float speed = 2.0f; Vector3 min; Vector3 max; void Update () { Vector3 viewport = Camera.main.WorldToViewportPoint(this.transform.position); Vector3 viewmin = new Vector3(0.0f, 0.0f,viewport.z); Vector3 viewmax = new Vector3(1.0f, 1.0f,viewport.z); min = Camera.main.ViewportToWorldPoint(viewmin); max = Camera.main.ViewportToWorldPoint(viewmax); Debug.Log(max); } void FixedUpdate(){ Vector3 pos = this.transform.position + this.transform.TransformDirection(this.transform.right * speed); pos.x = Mathf.Clamp(pos.x, min.x, max.x); rb.velocity = transform.InverseTransformDirection(pos - this.transform.position); }
### 追記③
C#
1 Vector3 max; 2 3 void Start () { 4 //空のゲームオブジェクトの位置に設定。 5 max = go.transform.position; 6 } 7 8 void FixedUpdate(){ 9 10 Vector3 pos = this.transform.position + this.transform.TransformDirection(this.transform.right * speed); 11 pos.x = Mathf.Clamp(pos.x, min.x, max.x); 12 13 rb.velocity = transform.InverseTransformDirection(pos - this.transform.position); 14 }
### 追記④
C#
1 Vector3 min; 2 Vector3 max; 3 4 void Start () { 5 } 6 7 8 void Update () { 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 min = Camera.main.ViewportToWorldPoint(viewmin); 13 max = Camera.main.ViewportToWorldPoint(viewmax); 14 } 15 16 17 void FixedUpdate(){ 18 19 Vector3 pos = this.transform.position + this.transform.TransformDirection(this.transform.right * speed); 20 pos.x = Mathf.Clamp(pos.x, min.x, max.x); 21 pos.z = Mathf.Clamp(pos.z, min.z, max.z); 22 23 rb.velocity = transform.InverseTransformDirection(pos - this.transform.position);
### 追記⑤
C#
1 void Update () { 2 Vector3 viewport = Camera.main.WorldToViewportPoint(this.transform.position); 3 Vector3 viewmin = new Vector3(0.0f, 0.0f,viewport.z); 4 Vector3 viewmax = new Vector3(1.0f, 1.0f,viewport.z); 5 min = Camera.main.ViewportToWorldPoint(viewmin); 6 max = Camera.main.ViewportToWorldPoint(viewmax); 7 } 8 9 10 void FixedUpdate(){ 11 12 Vector3 baseVelocity = this.transform.right * speed; 13 Vector3 pos = this.transform.position + this.transform.TransformDirection(baseVelocity); 14 pos.x = Mathf.Clamp(pos.x, min.x, max.x); 15 16 Vector3 vel = transform.InverseTransformDirection(pos - this.transform.position); 17 vel.z = vel.z * vel.x /baseVelocity.x; 18 rb.velocity = vel; 19 }
下の画像の位置で停止しました。ちょっと画面外に出てしまっています。
※移動時はy方向に動きません。
### 追記⑥
追記⑤の画像の停止位置とほぼ変わらない状態でした。
C#
1 void FixedUpdate(){ 2 3 Vector3 viewport = Camera.main.WorldToViewportPoint(this.transform.position); 4 Vector3 viewmin = new Vector3(0.0f, 0.0f,viewport.z); 5 Vector3 viewmax = new Vector3(1.0f, 1.0f,viewport.z); 6 min = Camera.main.ViewportToWorldPoint(viewmin); 7 max = Camera.main.ViewportToWorldPoint(viewmax); 8 9 Vector3 baseVelocity = this.transform.right * speed; 10 Vector3 pos = this.transform.position + this.transform.TransformDirection(baseVelocity); 11 pos.x = Mathf.Clamp(pos.x, min.x, max.x); 12 13 Vector3 vel = transform.InverseTransformDirection(pos - this.transform.position); 14 vel.z = vel.z * vel.x /baseVelocity.x; 15 rb.velocity = vel; 16 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/17 08:07
2018/06/17 08:16
退会済みユーザー
2018/06/17 09:23 編集
2018/06/18 02:02
退会済みユーザー
2018/06/18 15:26 編集
2018/06/19 01:14
退会済みユーザー
2018/06/19 11:34
2018/06/20 01:53
退会済みユーザー
2018/06/20 15:36
2018/06/21 01:13
退会済みユーザー
2018/06/21 15:16
2018/06/22 01:41
退会済みユーザー
2018/06/22 11:29
2018/06/25 06:43
退会済みユーザー
2018/06/25 15:35 編集