teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

ソースコードの追加

2020/09/05 09:25

投稿

futon03
futon03

スコア33

title CHANGED
File without changes
body CHANGED
@@ -96,7 +96,215 @@
96
96
  }
97
97
  }
98
98
  ```
99
+ ```C#
100
+ //参考になるか分かりませんが、プレイヤーオブジェクトとして使っているUnityちゃんのソースコードです。
101
+ // Mecanimのアニメーションデータが、原点で移動しない場合の Rigidbody付きコントローラ
102
+ // サンプル
103
+ // 2014/03/13 N.Kobyasahi
104
+ //
105
+ using UnityEngine;
106
+ using System.Collections;
107
+ using System.Runtime.CompilerServices;
99
108
 
109
+ namespace UnityChan
110
+ {
111
+ // 必要なコンポーネントの列記
112
+ [RequireComponent(typeof(Animator))]
113
+ [RequireComponent(typeof(CapsuleCollider))]
114
+ [RequireComponent(typeof(Rigidbody))]
115
+
116
+ public class UnityChanControlScriptWithRgidBody : MonoBehaviour
117
+ {
118
+
119
+ public float animSpeed = 1.5f; // アニメーション再生速度設定
120
+ public float lookSmoother = 3.0f; // a smoothing setting for camera motion
121
+ public bool useCurves; // Mecanimでカーブ調整を使うか設定する
122
+ // このスイッチが入っていないとカーブは使われない
123
+ public float useCurvesHeight = 0.5f; // カーブ補正の有効高さ(地面をすり抜けやすい時には大きくする)
124
+
125
+ // 以下キャラクターコントローラ用パラメタ
126
+ // 前進速度
127
+ public float PlayerSpeed = 3.0f;
128
+ // 後退速度
129
+ //public float backwardSpeed = 2.0f;
130
+ // 旋回速度
131
+ public float rotateSpeed = 2.0f;
132
+ // ジャンプ威力
133
+ public float jumpPower = 3.0f;
134
+
135
+ // 移動速度の入力に対する追従度
136
+ public float moveForceMultiplier;
137
+ //カメラ取得
138
+ public GameObject mainCamera;
139
+ // カメラの向きに合わせて移動させたい場合はtrue(慣性)
140
+ public bool isUseCameraDirection = true;
141
+
142
+ // キャラクターコントローラ(カプセルコライダ)の参照
143
+ private CapsuleCollider col;
144
+ //private Rigidbody rb;
145
+ public Rigidbody rb; //自分で書き換えた
146
+ // キャラクターコントローラ(カプセルコライダ)の移動量
147
+ private Vector3 velocity;
148
+ private Vector3 velocityX;
149
+ // CapsuleColliderで設定されているコライダのHeiht、Centerの初期値を収める変数
150
+ private float orgColHight;
151
+ private Vector3 orgVectColCenter;
152
+ private Animator anim; // キャラにアタッチされるアニメーターへの参照
153
+ private AnimatorStateInfo currentBaseState; // base layerで使われる、アニメーターの現在の状態の参照
154
+
155
+ //private GameObject cameraObject; // メインカメラへの参照
156
+
157
+ // アニメーター各ステートへの参照
158
+ static int idleState = Animator.StringToHash ("Base Layer.Idle");
159
+ static int locoState = Animator.StringToHash ("Base Layer.Locomotion");
160
+ static int jumpState = Animator.StringToHash ("Base Layer.Jump");
161
+ static int restState = Animator.StringToHash ("Base Layer.Rest");
162
+
163
+ // 初期化
164
+ void Start ()
165
+ {
166
+ // Animatorコンポーネントを取得する
167
+ anim = GetComponent<Animator>();
168
+ // CapsuleColliderコンポーネントを取得する(カプセル型コリジョン)
169
+ col = GetComponent<CapsuleCollider>();
170
+ rb = GetComponent<Rigidbody>();
171
+ //メインカメラを取得する
172
+ //cameraObject = GameObject.FindWithTag ("MainCamera");
173
+ // CapsuleColliderコンポーネントのHeight、Centerの初期値を保存する
174
+ orgColHight = col.height;
175
+ orgVectColCenter = col.center;
176
+ }
177
+
178
+ void Update()
179
+ {
180
+ //範囲指定
181
+ float fPosX, fPosY;
182
+ fPosX = fPosY = 0.0f;
183
+ if (transform.position.x > 30.0f)
184
+ {
185
+ fPosX = 30.0f;
186
+ }
187
+ else if (transform.position.x < -30.0f)
188
+ {
189
+ fPosX = -30.0f;
190
+ }
191
+ else
192
+ {
193
+ fPosX = transform.position.x;
194
+ }
195
+ if (transform.position.y < 0.55f)
196
+ {
197
+ fPosY = 0.55f;
198
+ }
199
+ else
200
+ {
201
+ fPosY = transform.position.y;
202
+ }
203
+ transform.position = new Vector3(fPosX, fPosY, transform.position.z);
204
+ }
205
+
206
+
207
+ // 以下、メイン処理.リジッドボディと絡めるので、FixedUpdate内で処理を行う.
208
+ void FixedUpdate ()
209
+ {
210
+ Vector3 moveVector = Vector3.zero; // 移動速度の入力
211
+
212
+ float h = Input.GetAxis ("Horizontal"); // 入力デバイスの水平軸をhで定義
213
+ float v = Input.GetAxis ("Vertical"); // 入力デバイスの垂直軸をvで定義
214
+ anim.SetFloat ("Speed", v); // Animator側で設定している"Speed"パラメタにvを渡す
215
+ anim.SetFloat ("Direction", h); // Animator側で設定している"Direction"パラメタにhを渡す
216
+ anim.speed = animSpeed; // Animatorのモーション再生速度に animSpeedを設定する
217
+ currentBaseState = anim.GetCurrentAnimatorStateInfo (0); // 参照用のステート変数にBase Layer (0)の現在のステートを設定する
218
+ rb.useGravity = true;//ジャンプ中に重力を切るので、それ以外は重力の影響を受けるようにする
219
+
220
+
221
+
222
+ // 以下、キャラクターの移動処理
223
+ velocity = new Vector3 (0, 0, v); // 上下のキー入力からZ軸方向の移動量を取得
224
+ // キャラクターのローカル空間での方向に変換
225
+ velocity = transform.TransformDirection (velocity);
226
+ //以下のvの閾値は、Mecanim側のトランジションと一緒に調整する
227
+ if (v > 0.1) {
228
+ velocity *= PlayerSpeed; // 移動速度を掛ける
229
+ } else if (v < -0.1) {
230
+ velocity *= PlayerSpeed; // 移動速度を掛ける
231
+ }
232
+
233
+
234
+ // 上下のキー入力でキャラクターを移動させる
235
+ transform.localPosition += velocity * Time.fixedDeltaTime;
236
+ // 左右のキー入力でキャラクタをY軸で旋回させる
237
+ transform.Rotate(0, h * rotateSpeed, 0);
238
+
239
+
240
+
241
+ if (isUseCameraDirection)
242
+ {
243
+ Vector3 cameraForward = mainCamera.transform.forward;
244
+ //Vector3 cameraRight = mainCamera.transform.right;
245
+ cameraForward.y = 0.0f; // 水平方向に移動させたい場合はy方向成分を0にする
246
+ //cameraRight.y = 0.0f;
247
+
248
+ moveVector = PlayerSpeed * (/*cameraRight.normalized * h +*/ cameraForward.normalized * v);
249
+ }
250
+ else
251
+ {
252
+ moveVector.x = PlayerSpeed * h;
253
+ moveVector.z = PlayerSpeed * v;
254
+ }
255
+
256
+ //Rigidbodyを使った慣性
257
+ rb.AddForce(moveForceMultiplier * (moveVector - rb.velocity));
258
+
259
+ // 以下、Animatorの各ステート中での処理
260
+ // Locomotion中
261
+ // 現在のベースレイヤーがlocoStateの時
262
+ if (currentBaseState.nameHash == locoState) {
263
+ //カーブでコライダ調整をしている時は、念のためにリセットする
264
+ if (useCurves) {
265
+ resetCollider ();
266
+ }
267
+ }
268
+
269
+ // IDLE中の処理
270
+ // 現在のベースレイヤーがidleStateの時
271
+ else if (currentBaseState.nameHash == idleState) {
272
+ //カーブでコライダ調整をしている時は、念のためにリセットする
273
+ if (useCurves) {
274
+ resetCollider ();
275
+ }
276
+ // スペースキーを入力したらRest状態になるs
277
+ if (Input.GetButtonDown ("Jump")) {
278
+ anim.SetBool ("Rest", true);
279
+ }
280
+ }
281
+ // REST中の処理
282
+ // 現在のベースレイヤーがrestStateの時
283
+ else if (currentBaseState.nameHash == restState) {
284
+ //cameraObject.SendMessage("setCameraPositionFrontView"); // カメラを正面に切り替える
285
+ // ステートが遷移中でない場合、Rest bool値をリセットする(ループしないようにする)
286
+ if (!anim.IsInTransition (0)) {
287
+ anim.SetBool ("Rest", false);
288
+ }
289
+ }
290
+ }
291
+
292
+
293
+
294
+
295
+
296
+
297
+ // キャラクターのコライダーサイズのリセット関数
298
+ void resetCollider ()
299
+ {
300
+ // コンポーネントのHeight、Centerの初期値を戻す
301
+ col.height = orgColHight;
302
+ col.center = orgVectColCenter;
303
+ }
304
+ }
305
+ }
306
+ ```
307
+
100
308
  ### 試したこと
101
309
 
102
310
  下のサイトを参考にプレイヤーから標的に放物線を描いてとんでいくコードを書いた。

1

参考にしたサイトを貼り忘れていました

2020/09/05 09:25

投稿

futon03
futon03

スコア33

title CHANGED
File without changes
body CHANGED
@@ -100,7 +100,7 @@
100
100
  ### 試したこと
101
101
 
102
102
  下のサイトを参考にプレイヤーから標的に放物線を描いてとんでいくコードを書いた。
103
-
103
+ https://qiita.com/_udonba/items/a71e11c8dd039171f86c
104
104
  ### 補足情報(FW/ツールのバージョンなど)
105
105
  環境:Windows10、Unity2020.1.0b8、VisualStudio2019
106
106