本講座では、UnityとC#を用いて3DFPSゲームを作成していきます。今回はその第5回目です。
前回はFPSゲームの攻撃手段として弓矢を作成し、矢の生成、射出、再装填機能などを実装し、矢を飛ばせるようにしました。
前回の記事 :
今回はFPSゲームでおなじみの銃弾や放たれた矢の当たり判定や照準器(エイム)の機能を実装し、ちゃんと狙いを付けて飛ばせるように改造していきます。
Unityで作るFPSゲームの照準器・エイム・的(ターゲット)の作成
現在弓矢は少し左にずれています。これはど真ん中に置くと見にくいからなのですが、この位置から正面に矢を発射すると弓の位置からの正面、つまり少し左から右の方に飛んでいくことになります。
これだと狙いが定めにくいので、ちゃんと狙いをつけて飛ばせるように調整していきます。
そのための照準器・通称エイムと呼ばれる機能を実装していきます。
照準器エイムオブジェクトの作成
まずはぱっと見でわかるような照準器エイムとなるような的を作成していきます。
Projectウインドウの「Assets/sTargeting/Texture」にあるテクスチャをみてください。ここにたくさん的画像があるので好きなのを使ってOKです。
ここでは「ring target 6」を使用します。まず「ring target 6」を選択してWinなら「ctrl+D」、Macなら「command+D」で複製します。その複製した「ring target 21」(おそらくこの名前に勝手に変わります)を「Assets/AppMain」に移動しておきましょう。
次に移動した「ring target 21」を選択しInspectorを見てください。選択した画像の情報を編集できるので、一番上「TextureType」を選択して「Sprite(2D and UI)」に変更します。その後「Apply」ボタンを押して変更を適用します。
これらの設定はUIのImageに画像を設定するための設定なので、Imageを表示していきましょう。
Hierarchyの「Player」の子に右クリックから「UI→Canvas」でキャンバスを作成します。名前を「PlayerUICanvas」と変更しておきます。
次にその「PlayerUICanvas」の子に右クリックから「UI→Image」で「Image」を作成します。名前を「TargetImage」としておきます。
この「TargetImage」を選択しInspectorの「Image」コンポーネントの一番上「SourceImage」の部分に先ほどの「ring target 21」をドラック&ドロップして設定します。最後にその下の「Color」ので色を好きな色に変更指定おきましょう。ここでは黄色にしておきます。
この時色設定一番下の「A」の部分、これが「Alpha(透明度)」を表す値なので少し下げておくと半透明になるので少しフィールドが見やすくなります。
また、現在「TargetImage」の大きさ(RectTransformのWidthとHieght)は「(100, 100)」になっていますが、見た目の良さで変更して構いません。
だだし位置は真ん中のまま変更はしないこと、また画面の解像度設定によって同じ大きさでも見た目が変わってきますのでご注意ください。
参考までに今回はここから、UnityのGameウインドウの上部で「Full HD(1920*1080)」に変更しておきます。
これで的の完成です。ただしこれはただの見た目だけで何の効果もない的なので処理をはまた別に作成していきます。
UnityのRaycast機能を使ってFPSの弾の発射を計測・一番近くの衝突物を検出する
発射位置を測るには、まず画面の真ん中からレーザーのようなものを飛ばして、そのレーザーに当たった位置の方向をターゲットとします。
このレーザーを眼に見えるように作成すると、銃などのFPSであるレーザーポインタになりますが、今回は弓矢であることも踏まえ目には見えないようにレーザーを飛ばします。
このレーザーをUnityでは「Ray(レイ)」といいスクリプトで発射して、ヒットしたオブジェクトを取得できたりしますのでそれを使っていきましょう。
まずはターゲットが目に見えるように「AppPlayerController」に追記していきます。
射出した矢を敵にヒットさせる
では、一旦敵も簡単に作成してヒットするようにしていきましょう。
まずはHierarchyに空オブジェクトを作成し「Enemy1」という名前にします。そして「Assets/Creature_Monsters_X/Prefabs」に敵のプレハブがあるので好きなものを「Enemy1」の子にドラック&ドロップします。(色違いです)
次に配置した「Monster_X_Green」(色次第で名前の最後が変わります)を選択し、InspectorでTransformを下記のように設定します。
1 2 3 4 |
Transform Position( 0, 0, 0 ) Rotation( 0, 0, 0 ) Scale( 0.1, 0.1, 0.1 ) |
次に「Enemy1」に「Rigidbody」と「CapsuleCollider」を付与します。コライダーは下記画像を参考に敵の体を覆うくらいのサイズに変更し、リジッドボディは下記の値に設定します。
1 2 3 4 5 6 7 8 9 10 |
Rigidbody Mass : 100 Drag : 0 Angular Drag : 0.05 Use Gravity : true Is Kinematic : false Interpolate : None Collision Detection : Discrete Freeze Position : 全てfalse Freeze Rotation : 全てtrue |
できたら、「Enemy1」を移動してカメラに敵が映るようにしておきましょう。リジッドボディとコライダーがついてるので、地面の少し上くらいに配置すれば勝手に落ちて地面に着地します。
また「Monster_X_Green」に初めから「Animator」というコンポーネントがついていますので、この「Controller」という項目があるのでここに設定されているものを「None」に設定しておくと、変に動き出すことがなくなります。(アニメーションを設定しているコンポーネントですが、今は何もしなくても大丈夫です)
最後にタグを設定します。先にコードに書いた「Enemy」タグを設定しましょう。
Hierarchyで何かしらを選択しInspectorの上部の「Tag」部分を選択し「Add Tags…」から「Enemy」というタグを作成し、「Enemy1」に「Enemy」タグを設定しましょう。
では再生してみましょう。
敵に向かって矢を打ってみましょう。ヒットして刺さった感じになって止まるようになったかと思います。(青い球はターゲットのマーカーです。解説用に表示していますが、「MeshRenderer」を無効にして見た目は消してしまってもOKです。)
今回は以上です。次回は敵にヒットした後の処理を作成していきましょう。
次回の記事 :
コメント