質問編集履歴
2
ソースコードの追加
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
参考にしたサイトを貼り忘れていました
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
|
|