Unity3Dで3Dシューティングの作り方、パート1(Quadのフロア、プレイヤーの移動と回転とアニメーション、スムーズなカメラの移動)

対人戦のような3Dシューティングゲームを作ってみます。対人といってもプレイヤーも敵も人ではなく、マスコットキャラクターのようなやつです。


こんなのがレーザー銃を撃ちます。


Unityのチュートリアル、SURVIVAL SHOOTERを元に作っています。

環境設定

Unity: Survival shooter – Environment setup

このプロジェクトはUnity4.6以上が必要なのでUnity4.6以上が入っていない人はダウンロードしてインストールしましょう。

それでは新しいプロジェクトを作成します。

File → New Project
適当なところに新しいフォルダ(Shooting3D)を作成して、新しいプロジェクトを作成します。

Survival shooterのアセットストアから、必要なファイルをインポートします。Unityのアカウントがないとインポートできなかったと思うので気をつけてください。

現在のシーンを保存する
File → Save Scene

ScenesフォルダのLevel_01フォルダにLevel 01という名前でシーンを保存します。

PrefabsのEnvironmentをHierarchyにドロップします。HierarchyのEnvironmentを選択すると、あっという間にゲームっぽいシーンが作られています。

PrefabsのLightsをシーンビューにドロップします。場所は特に気にする必要はありません。

Floorを作成します。
GameObject → 3D Object → Quad

Quadの位置をリセットして、RotationのXを90にして、ScaleはX:100 Y:100に変更します。そしてQuadの名前をFloorに変更します。
InspectorにあるMesh RendererをRemove Componentします。
FloorのLayerをDefaultからFloorにします。

バックグラウンドに流す音楽を設定します。
空のGameObjectを作成してBackgroundMusicという名前に変更します。
InspectorのAdd Component → Audio → Audio Source
Audio Clipの右側の丸いポッチのところをクリックしてBackground Musicを選択します。Play On Awakeのチェックをはずして、Loopにチェックをつけます。Volumeを0.1くらいに変更します。

ここまででこんな感じになります。

プレイヤーのキャラクター

Unity: Survival shooter – Player Character

Assets → Models → Characters
PlayerをHierarchyにドロップしてPlayerオブジェクトの位置をリセットします。そしてPlayerオブジェクトのTagをPlayerに変更します。

Assets → Animation
Animator Controllerを作成して、PlayerACという名前に変更します。
PlayerACをPlayerオブジェクトにアタッチします。

Animatorビューを付け加えます。
Window → Animator

Assets → Models → Characters → Player
三角のマークをクリックすると展開され、そのなかにDeath、Idle、Moveがあり、それらをAnimatorビューにドロップします。

AnimatorビューのIdleを右クリックしてSet As Defaultにします。

Parametersの右側の+をクリックしてBoolでIsWalkingという名前のParameterを作成します。同じようにTriggerでDieという名前のParameterを追加します。

AnimatorビューのIdleを右クリックしてMake Transitionを選択します。矢印が出てくるのでそれをMoveにクリックしてくっつけます。

IdleからMoveに伸びている矢印をクリックします。
InspectorのConditionsのExit TimeをIsWalkingに変更します。

同じようにMoveからIdleへTransitionを作成して、
ConditionsをIsWalkingへ変更してfalseにします。

Any StateからDeathへTransitionを作成して、
ConditionsをDieにします。

Sceneビューに戻って、Playerオブジェクトを選択してAdd ComponentからPhysics → Rigidbodyを追加します。
RigidbodyのDragとAngular DragをInfinityに変更して、ConstraintsのPositionのY、RotationのXとZをチェックします。

同じようにAdd ComponentからPhysics → Capsule Colliderを追加します。
Capsule ColliderのCenterをX:0.2 Y:0.5にして、Heightを1.2に変更します。

Add ComponentからAudio → Audio Sourceを追加します。
Audio ClipにPlayer Hurtを選択します。

Assets → Scripts → Player
PlayerMovementスクリプトをPlayerオブジェクトへアタッチします。

PlayerMovementスクリプトをダブルクリックしてエディタを起動させて、編集します。

PlayerMovementスクリプト

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
	public float speed = 6f;

	Vector3 movement;
	Animator anim;
	Rigidbody playerRigidbody;
	int floorMask;
	float camRayLength = 100f;

	void Awake(){
		floorMask = LayerMask.GetMask ("Floor");
		anim = GetComponent<Animator>();
		playerRigidbody = GetComponent<Rigidbody>();
	}

	void FixedUpdate(){
		float h = Input.GetAxisRaw ("Horizontal");
		float v = Input.GetAxisRaw ("Vertical");

		Move (h, v);
		Turning ();
		Animating (h, v);
	}

	void Move(float h, float v){
		movement.Set (h,0,v);

		movement = movement.normalized * speed * Time.deltaTime;

		playerRigidbody.MovePosition (transform.position + movement);
	}

	void Turning(){
		Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);

		RaycastHit floorHit;

		if(Physics.Raycast(camRay, out floorHit, camRayLength, floorMask)){
			Vector3 playerToMouse = floorHit.point - transform.position;
			playerToMouse.y = 0f;

			Quaternion newRotation = Quaternion.LookRotation (playerToMouse);
			playerRigidbody.MoveRotation(newRotation);
		}
	}

	void Animating(float h, float v){
		bool walking = h != 0f || v != 0f;
		anim.SetBool ("IsWalking", walking);
	}
}

これでPlayerがキーボードの矢印で動いてマウスのほうへ銃口を向けるようになります。マウスのほうへ銃口を向けるのにTurningメソッドを使っています。メインカメラからマウスの場所へ視線が出ていて、それがFloorにあたるところが、floorHitになって、floorHitとPlayerのPositionからPlayerの向きを変えさせる。3Dプレイヤーの向きってこんなふうに変えるんだ。。とでも思っておきましょう。

カメラの設定

Unity: Survival shooter – Camera setup

HierarchyのMain Cameraを選択
Position X:1 Y:15 Z:-22
Rotation X:30
Backgroundを黒に変更
ProjectionをOrthographicに変更
Size 4.5

Assets → Camera
CameraFollowスクリプトを作成して編集します。

using UnityEngine;
using System.Collections;

public class CameraFollow : MonoBehaviour {

	public Transform target;
	public float smoothing = 5f;

	Vector3 offset;

	void Start(){
		offset = transform.position - target.position;
	}

	void FixedUpdate(){
		Vector3 targetCamPos = target.position + offset;
		transform.position = Vector3.Lerp (transform.position, targetCamPos, smoothing * Time.deltaTime);
	}
}

transformはメインカメラ、targetはプレイヤーです。プレイヤーが動くとメインカメラも少し時間差(Lerp)を入れてついていきます。

CameraFollowスクリプトをMain Cameraにアタッチします。そしてMain CameraのInspectorにあるCamera Follow(Script)のTargetにHierarchyのPlayerをアタッチします。

これでPlayボタンを押すと、Playerを動かすごとにカメラが一緒に付いていくようになっています。

最後のPlayerオブジェクトをAssetsのPrefabsにドラッグ&ドロップしてプレハブ化します。

今回は以上です。

コメントを残す

メールアドレスが公開されることはありません。

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