質問編集履歴

3

一部追記しました

2020/09/11 00:46

投稿

kudo201810
kudo201810

スコア30

test CHANGED
File without changes
test CHANGED
@@ -32,6 +32,14 @@
32
32
 
33
33
 
34
34
 
35
+ 【追記】
36
+
37
+ **初期のローテーションがすべて0の場合は、上を押し続けると球面を回転できるのですが
38
+
39
+ 初期のローテーションが0以外(少しでも回転している)と上を押し続けるとおかしな状態(姿勢がおかしくなり空中を歩く)**
40
+
41
+
42
+
35
43
  右や左に回転したあと上で前方にすすんでも
36
44
 
37
45
  ちゃんと球面にそって歩かせたいのですが

2

ソースを追加

2020/09/11 00:45

投稿

kudo201810
kudo201810

スコア30

test CHANGED
File without changes
test CHANGED
@@ -47,3 +47,211 @@
47
47
  以下のようになります
48
48
 
49
49
  ![イメージ説明](72b1b166f8f7d5967a6a2efeaa03603f.jpeg)
50
+
51
+
52
+
53
+ ソースは以下
54
+
55
+ ```ここに言語を入力
56
+
57
+ using System.Collections;
58
+
59
+ using System.Collections.Generic;
60
+
61
+ using UnityEngine;
62
+
63
+
64
+
65
+ public class GravityFreeAgent_src : MonoBehaviour
66
+
67
+ {
68
+
69
+ public float speed = 0.4f;
70
+
71
+ public float Rspeed = 0.5f;
72
+
73
+ public float hit_distance = 0.49f;//元は0.05f
74
+
75
+ [SerializeField]
76
+
77
+ Transform CenterOfBalance; // 重心
78
+
79
+ Animator anim;
80
+
81
+
82
+
83
+ Vector3 vec = new Vector3(0, -1f, 0);
84
+
85
+ public float r = 0.2f;
86
+
87
+
88
+
89
+ void Start()
90
+
91
+ {
92
+
93
+ anim = GetComponent<Animator>();
94
+
95
+ }
96
+
97
+
98
+
99
+ void Update()
100
+
101
+ {
102
+
103
+
104
+
105
+ // キーボード入力で移動、回転
106
+
107
+ if (Input.GetKey(KeyCode.LeftArrow))
108
+
109
+ {
110
+
111
+ transform.Rotate(
112
+
113
+ new Vector3(0, -Rspeed, 0),
114
+
115
+ Space.Self
116
+
117
+ );
118
+
119
+ }
120
+
121
+ else if (Input.GetKey(KeyCode.RightArrow))
122
+
123
+ {
124
+
125
+ transform.Rotate(
126
+
127
+ new Vector3(0, Rspeed, 0),
128
+
129
+ Space.Self
130
+
131
+ );
132
+
133
+ }
134
+
135
+ else if (Input.GetKey(KeyCode.UpArrow))
136
+
137
+ {
138
+
139
+ transform.position =
140
+
141
+ transform.position +
142
+
143
+ (transform.forward * speed * Time.fixedDeltaTime);
144
+
145
+
146
+
147
+ //歩くアニメーション
148
+
149
+ anim.SetBool("run_f",true);
150
+
151
+ }
152
+
153
+ else if (Input.GetKey(KeyCode.DownArrow))
154
+
155
+ {
156
+
157
+ transform.position =
158
+
159
+ transform.position +
160
+
161
+ (transform.forward * speed * Time.fixedDeltaTime);
162
+
163
+
164
+
165
+
166
+
167
+ }
168
+
169
+
170
+
171
+ if (Input.GetKeyUp(KeyCode.UpArrow))
172
+
173
+ {
174
+
175
+ //待機アニメーション
176
+
177
+ anim.SetBool("run_f", false);
178
+
179
+ }
180
+
181
+
182
+
183
+
184
+
185
+ RaycastHit hit;
186
+
187
+
188
+
189
+ // Transformの真下の地形の法線を調べる
190
+
191
+ if (Physics.SphereCast(
192
+
193
+ CenterOfBalance.position,
194
+
195
+ r,
196
+
197
+ - transform.up,
198
+
199
+ out hit,
200
+
201
+ float.PositiveInfinity))
202
+
203
+ {
204
+
205
+ Debug.Log(hit.collider.name+hit.distance);
206
+
207
+
208
+
209
+ //// 傾きの差を求める
210
+
211
+ Quaternion q = Quaternion.FromToRotation(
212
+
213
+ transform.up, hit.normal);
214
+
215
+
216
+
217
+ // 自分を回転させる
218
+
219
+ transform.rotation *= q;
220
+
221
+
222
+
223
+ // 地面から一定距離離れていたら落下
224
+
225
+ if (hit.distance > hit_distance)
226
+
227
+ {
228
+
229
+ transform.position =
230
+
231
+ transform.position +
232
+
233
+ (vec * Physics.gravity.magnitude * Time.fixedDeltaTime);
234
+
235
+ }
236
+
237
+ }
238
+
239
+ else
240
+
241
+ {
242
+
243
+ Debug.Log("no hit root!");
244
+
245
+ }
246
+
247
+
248
+
249
+ }
250
+
251
+
252
+
253
+ }
254
+
255
+
256
+
257
+ ```

1

画像を追加しました

2020/09/10 03:07

投稿

kudo201810
kudo201810

スコア30

test CHANGED
File without changes
test CHANGED
@@ -41,3 +41,9 @@
41
41
 
42
42
 
43
43
  よい方法がありましたらぜひ回答をお願いしたいです。
44
+
45
+
46
+
47
+ 以下のようになります
48
+
49
+ ![イメージ説明](72b1b166f8f7d5967a6a2efeaa03603f.jpeg)