対人戦のような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にドラッグ&ドロップしてプレハブ化します。
今回は以上です。
コメントを残す