Unity

Unityで3Dシューティングアクションを作ろう①

投稿日:2019年6月4日 更新日:

チュートリアルの内容

3D空間を走り回り、弾を飛ばして敵を倒すゲームを作ります。

今回やること

  • プレイヤーの移動
  • アニメーションの遷移
  • カメラの追従

事前に準備するもの

プレイヤー(待機アニメーション、走るアニメーション、攻撃アニメーション)
敵キャラ(走るアニメーション、攻撃アニメーション)
キャラクター素材の作り方はこちら

プレイヤーが飛ばす弾、敵の攻撃エフェクト

気に入ったエフェクト素材をインポートして下さい。

プレイヤーの移動とアニメーションの遷移

チェックをつけたら右下のApplyを押して確定しましょう

C#の解説

C#の解説はこちらにまとめておいたので読んで下さい♪

それでは実際にスクリプトを作っていきましょう

  • プレイヤーが前後左右に動く
  • 動いてない時は待機アニメーション、動いている時は走っているアニメーションに切り替わる
  • 重力をかける

を実装していきます

まず、Playerと名前をつけたスクリプトを開くと、初期状態では以下のようになります。

因みにスクリプト内にある//はコメントを表していて、//より右側はスクリプトとは関係のない文字となります。
例えば、 「//!”#$$%%」 と無茶苦茶に書いてもそれによってバグることはありません。
多くの場合、スクリプトの命令が何を示しているのか、メモ的に説明を加えます。

それではまず、使う変数を宣言します

入力する命令は以下の通りです。
変数を宣言する部分に入れてみましょう。

実際に入力すると以下のようになります。

#それでは一つ一つ説明していきます。説明は折りたたんであるので、ちゃんと理解したい人は▶をクリックして下さい。

private CharacterController characterController;

Unityではプレイヤーの移動をさせる際にCharacterControllerというものをつけると便利です。
これをつけるとプレイヤーに地面との接触判定をつけることができ、更には段差や坂などを自動で
判定して上り下りできるようになります。
プレイヤーの移動はこのCharacterControllerを操作するので定義しておきます。
定義をしておかないと後々数値をとって操作することができません。
因みにprivateというのはスクリプトを貼り付けたオブジェクトのみで使う変数で、他のオブジェクトでも
変数を使う場合にはpublicにします。
ここではCharacterControllerの値の名前はcharacterControllerにして
この変数はプレイヤーでしか、使わないよーって言っています。
characterControllerの部分はあだ名をつけているだけなのでどんな名前でも大丈夫です。

private Vector3 velocity;

Vector3というのは3次元ベクトルのことです。分かりやすく言うと方向です。
例えばこの後プレイヤーの移動をするようにするのですが上と左を同時に押したらちょうど
上と左の間に進むと思います。特に3Dの世界ではどっちを向いていてどっちに進むのか常に意識してもらわないと
どこに進んで良いのかわからなくなってしまいます。
なので方向をしっかりと数値として取るわけです。
velocityの部分はどんな名前でも大丈夫です。

public float walkSpeed;

これは移動するスピードを決めています。
因みにプレイヤーでしか使わなそうなのに、何故publicにしているかと言うと、publicにしておくと
数値をUnityの画面で設定できるようになるからです。
移動スピードはゲームをプレイしてみて感覚で変えていきたいところなので、改変しやすいようにpublicに
しています。

private Animator animator;

これは先程設定したAnimatorControllerの変数の値を後々このスクリプトでコントロールするので定義しています。
アニメーションが切り替わるタイミングをスクリプトで制御するのにAnimatorControllerの変数を使うので、定義しておく
必要があります。
もちろん、animatorの部分はどんな名前でも大丈夫です。

続いてゲーム開始時、一度だけ実行する部分を入力していきます。
  

characterController = GetComponent();

変数を入れる場所で定義したコンポーネントは定義するだけでは使えず、値を取得する必要があります。
なので、ここでは定義したcharacterControllerにCharacterControllerの値を代入しています。
コンポーネントの取得の仕方は
定義した変数の名前 = GetComponent<コンポーネントの名前>();
です。
コンポーネントの操作をスクリプトで制御する場合には

  • 変数の定義
  • 変数に値を代入
  • 実際に操作

という流れを踏みます。

animator = GetComponent();

同様に定義したanimatorにAnimatorコンポーネントの値を入れています。

続いてゲーム開始後定期的に実行される部分を入力していきます。

void FixedUpdate ()

いきなりUpdateがFixedUpdateになっているので混乱を呼ぶかもしれませんね。
実はvoid Updateは定期に実行される(1フレームごとに一回実行)のですが、その1フレームの中で実行される
タイミングはランダムです。void FixedUpdateは実行されるタイミングが毎回同じになります。
キャラクターの移動の様に常に同じ様に実行されてほしい時にはvoid FixedUpdateにしたほうが動作が安定
するので変えています。

if (characterController.isGrounded)

これはcharacterControllerが地面に接地している時の判定を取っています。
これを入れないと空中でも歩けるようになってしまいます。

velocity = new Vector3(Input.GetAxis(“Horizontal”),0f,Input.GetAxis(“Vertical”));

これはvelocityという変数にベクトルの値を代入しています。
左右キー(Aキー,Dキー)が押されたらxが-1、+1上下キー(Wキー,Sキー)が押されたらzが+1、-1になります。

if (velocity.magnitude > 0.1f)

もしvelocityのmagnitudeが0.1より大きいなら…という条件文です。
magnitudeというのはx*x + y*y + z*zの平方根の値です。
要するにmagnitudeが0.1より大きい状態というのは上下左右のいずれかが押されている状態を指すので、
上下左右が押されている間はと言い換えることも出来ます。
何故わざわざこのようなことをしているかと言うと、上下左右のいずれかが押されている間はと入力するよりも
より詳細に値を認識させることが出来るため、なめらかな動きを実現できるからです。

animator.SetBool(“isRunning”, true);

AnimatorControllerで設定したBool型の変数(値がtrue(真)、false(偽)の2値のみの変数)であるisRunningをtrueにしています。
これにより、待機アニメーションから走るアニメーションに移行しています。

transform.LookAt(transform.position + velocity);

プレイヤーの向きを押されたキーの方向に変えています。
現在の位置から押されたキーの方向に力を加えることで現在の位置を基準にして押された方向に向きを変えています。

else

if文の{}のあとにつけることで「…でなければ」という命令を付け加えることが出来る。
この場合は上下左右キーが押されていなければとなります。

animator.SetBool(“isRunning”, false);

isRunningをfalseにしています。

velocity.y += Physics.gravity.y * Time.deltaTime;

velocityのyに重力を経過時間(Time.deltaTime)の分だけかけ続けています。
Physicsは重力のことでUnityで予め設定されています。

characterController.Move(velocity * walkSpeed * Time.deltaTime);

characterControllerをvelocity * walkSpeed * Time.deltaTime分だけ動かしています。
要するに設定したwalkSpeedの分だけ上下左右が押されている間動かし続けています。

完成形のスクリプト

※1はプレイヤーの移動、※2はアニメーションの制御に関係しています

カメラの追従

スクリプト内容は以下の通りです。
説明はコメントに記述してありますが、
Playerをtargetとしてカメラとの相対座標を求めていて、
常にカメラがPlayerから相対座標分離れたところに来るようにしています。

テストプレイをしてみると…

ステージが真っ白なんで分かりにくいですが3D空間を走り回っています。

続きはこちら

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

-Unity

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

漫画で分かるUnity #1 基本操作編

Unityで必ず理解しておいてほしい基本操作を漫画でまとめてみました♪ とりあえず、今からUnity始める人はこの漫画で基本を覚えてからやってみてください 関連

no image

Unityで3Dシューティングアクションを作ろう③

今回やること 敵キャラの作成 敵の攻撃 敵がプレイヤーに向かってくるようにする 敵のダメージ処理 敵キャラの作成 敵の攻撃 Enemyスクリプトには一番上のusing~の部分にも記入します。 usin …

no image

EffecSeerを使ってゲーム用のエフェクト作りに挑戦

さて、EffecSeerというソフトを使ってゲーム用のエフェクト作りに取り組みました このソフト、数値をいじったり、テクスチャを貼り付けたり、更には3Dモデルを読み込んだりと色んな技を使ってエフェクト …

no image

Unityでオブジェクトに色をつける

マテリアルの作成 Create → Materialを選択します マテリアルに名前をつける マテリアルに色をつける inspector部分の色のアイコンをクリックすると色を選択出来るようになります オ …

no image

Unityで3Dシューティングアクションを作ろう②

今回やること 弾を発射する 弾を発射する Playerスクリプトに追記していきます。該当する場所に追記していきます。 コルーチンが出てくるので追記する位置に注意しましょう。 ※最後に全部を追記したスク …

ゲタバコ倶楽部へようこそ

  • 16458総閲覧数:
  • 81今日の閲覧数:
  • 10201総訪問者数:
  • 53今日の訪問者数:

住所
Tokyo,Japan

営業時間
月火: 終日
水~金: 10:00 AM – 10:00 PM

このページはゲタバコ先生の日々思うことや活動を発信するページです
仕事の依頼、メッセージ等お気軽にご連絡ください

getabakosensei@gmail.com