回答編集履歴

2

情報の追記

2022/04/05 11:31

投稿

KomoriGameDev
KomoriGameDev

スコア433

test CHANGED
@@ -1,2 +1,5 @@
1
1
  RigidbodyなどUnity上で物理演算を使って当たり判定を行う場合は、transform.positionに直接代入するのは避けてください。
2
2
  transform.positionに直接代入したとき、内部的には「移動した」というより「ワープした」と見なされ、その間の当たり判定はしてくれません。ワープ的な移動をする場合は自分で移動制限を付けた方がいいと思います。
3
+
4
+ [追記]
5
+ そもそも、物理演算というのは現実世界の物体の運動をシミュレートするために作られているので、パズルゲームでよく使われるような飛び飛びの瞬間移動を伴う動きと相性が悪いです。左右の壁に当たったら移動自体をできなくしてしまう実装をするのが普通だと思います。

1

誤情報の修正

2022/04/05 11:01

投稿

KomoriGameDev
KomoriGameDev

スコア433

test CHANGED
@@ -1,77 +1,2 @@
1
1
  RigidbodyなどUnity上で物理演算を使って当たり判定を行う場合は、transform.positionに直接代入するのは避けてください。
2
- transform.positionに直接代入したとき、内部的には「移動した」というより「ワープした」と見なされ、その間の当たり判定はしてくれません。Rigidbodyがアタッチされているオブジェクトを移動させる場合に使うMovePosition()メソッドが用意されているの、それ使ってください。
2
+ transform.positionに直接代入したとき、内部的には「移動した」というより「ワープした」と見なされ、その間の当たり判定はしてくれません。ワープ的な移動をする場合は自分移動制限付けた方がいと思います
3
- ```cs
4
- using System.Collections;
5
- using System.Collections.Generic;
6
- using UnityEngine;
7
-
8
- public class MovePuyo : MonoBehaviour
9
- {
10
- private float span = 1f;
11
- private float timeNow;
12
- private float posX, posY, posZ;
13
- private bool touchDown = false;
14
- private float RightFramePosX = -0.5f, LeftFramePosX;
15
- private Rigidbody _rigidbody;
16
- // Start is called before the first frame update
17
- void Start()
18
- {
19
- TryGetComponent(out _rigidbody);
20
- }
21
-
22
- // Update is called once per frame
23
- void Update()
24
- {
25
- timeNow += Time.deltaTime;
26
-
27
- posX = transform.position.x;
28
- posY = transform.position.y;
29
- posZ = transform.position.z;
30
-
31
- Debug.Log(posX + ":" + posY + ":" + posZ);
32
-
33
- if(timeNow >= span)
34
- {
35
- _rigidbody.MovePosition(transform.position + new Vector3( 0, -1, 0));
36
- timeNow = 0f;
37
- if(touchDown == true)
38
- {
39
- this.enabled = false;
40
- }
41
- }
42
-
43
- /*下に押したとき spanを1fから0.05fに変更することで
44
- 下に降りるスピードが上がって下を押さずに早く移動することが可能*/
45
- if(Input.GetKeyDown(KeyCode.DownArrow))
46
- {
47
- span = 0.05f;
48
- }
49
-
50
- //右を押せば1マス右に移動
51
- if(Input.GetKeyDown(KeyCode.RightArrow))
52
- {
53
- _rigidbody.MovePosition(transform.position + new Vector3( 1, 0, 0));
54
- if(posX == RightFramePosX)
55
- {
56
- _rigidbody.MovePosition(transform.position - new Vector3( -1, 0, 0 ));
57
- Debug.Log("Right");
58
- }
59
- }
60
-
61
- //左を押せば1マス左に移動
62
- if(Input.GetKeyDown(KeyCode.LeftArrow))
63
- {
64
- _rigidbody.MovePosition(transform.position + new Vector3( -1, 0, 0));
65
- }
66
- }
67
-
68
- void OnCollisionEnter(Collision other)
69
- {
70
- if(other.gameObject.name == "Frame-Bottom")
71
- {
72
- touchDown = true;
73
- }
74
- }
75
- }
76
- ```
77
-