Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。コピー2021.03.06シンプルなアクションゲームを作ってみようの第18回です。今回は大砲を作成し、大砲から弾を飛ばしてプレイヤーに当たったらダメージを与える機能を作成していきます。前回はプレイヤーキャラクターのHPを管理するアセットの作成とHPをUIに表示する機能を作成しました。シンプルなアクションゲームを作ってみよう17-キャラクターのHPを表示する-シンプルなアクションゲームでプレイヤーのHPをScriptableObjectで作成してUIに表示し、敵に接近されたらHPを減らす機能を作成していきます。gametukurikata.com2021.03.05シンプルなアクションゲームを作ってみようの他の記事はシンプルなアクションゲームを作ってみようシンプルなアクションゲームを作るのを通してUnityの使い方を学ぶカテゴリです。gametukurikata.comから参照出来ます。スポンサーリンク大砲を作成する今回作成する大砲はUnityのプリミティブな図形のCubeを使って作成します。大砲のゲームオブジェクトを作成するまずは大砲の形状を作成していきます。Emptyを選択し、名前をCannonとします。Cannonは空のゲームオブジェクトなので大砲のベースとするゲームオブジェクトとして使用します。次に大砲の土台を作成します。Object→Cubeを選択し、名前をGunMountとします。GunMountを選択し、インスペクタのTransformの値を変更します。シーンビューでは以下のようになりました。Cannonの位置がプレイヤーキャラクターと被っているので、Cannonの位置をずらし見やすい場所に移動させます。CannonのインスペクタのTransformのXは-3.38にしました(シーンビューでCannonのX軸をドラッグしてもOK)。見やすければ問題ないです。次に砲台部分のゲームオブジェクトを作ります。Object→Cubeを選択し、名前をBarrelとします。Barrelゲームオブジェクトを選択し、インスペクタのTransformの値を変更します。シーンビューで確認すると以下のようになりました。これで大砲の形状が出来たように思いますが、大砲の砲身部分であるBarrelは回転してキャラクターの方向を向いて弾を発射出来る機能を取り付ける予定です。砲身であるBarrelはCubeゲームオブジェクトから作成したのでBarrelを回転するとBarrelの中心がCubeの真ん中にあるため中央で回転してしまいます。Barrelを選択し、Pivot表示にしてシーンビューを見るとわかりやすくなります。スクリプトで回転処理をさせようと思うと上のシーンビューの赤い四角の部分を中心に回転してしまいます。そこでBarrelの根本部分から回転出来るようにちょっとした工夫を加えたいと思います。砲身であるBarrelが根本で回転するように、Barrelの根本の部分に空のゲームオブジェクトを作成し、その空のゲームオブジェクトの子要素にBarrelを移動して、空のゲームオブジェクト自体を回転させれば子であるBarrelも相対的に回転するので砲身の根元から回転しているように見えます。そこでBarrelの根元のゲームオブジェクトを作成します。Emptyを選択し、名前をBasePointOfTheBarrelとします。BasePointOfTheBarrelの位置は砲身であるBarrelの根本の位置に移動させます。LotationがLocalであることを確認し、ローカル軸の青い矢印(そのゲームオブジェクトの前方)が砲身の先を向くように回転させます。わたくしの場合はBasePointOfTheBarrelのTransformを以下のようにしました。これでBarrelの根本であるBasePointOfTheBarrelが出来ました。次にBarrelをドラッグしてBasePointOfTheBarrelの子に移動させます。次は砲身から弾を飛ばす時の、弾を発射する位置を作成します。Emptyを選択し、名前をLaunchPositionとします。PositionをLocalにし、LaunchPositionの移動と回転を行います。上のような位置に移動させ、ローカル軸の青い矢印(そのゲームオブジェクトの前方)が弾が飛んでいく方向に向けます。変更したLaunchPositionのTransformは以下のようになりました。位置は弾のインスタンスの大きさによっては変更する必要が出てくるかもしれません。次に砲身を回転させるスクリプトを作成していきます。ここでは砲身と言っていますが、実際には砲身の根本であるBasePointOfTheBarrelを回転させます。Assets/Scriptsフォルダに新しくCannonRotationScriptという名前のスクリプトを作成し、BasePointOfTheBarrelゲームオブジェクトに取り付けます。{rigidBody.MoveRotation(viewingQuaternion);}}}rotatableは砲身を回転させるかどうかで、インスペクタでオン・オフを切り替えられます。rotationSpeedは砲身の回転スピードです。playerはプレイヤーキャラクターのTransformを入れます。rigidBodyはBasePointOfTheBarrelに取り付けるRigidbodyを入れます。viewingQuaternionは砲身を向ける角度を入れます。StartメソッドでGameObject.FindWithTagメソッドを使ってPlayerタグを取り付けられたプレイヤーキャラクターを探し、そのTransformを取得してplayerに入れます。rigidbodyを自身から取得します。viewingQuaternionには最初Quaternion.identityを入れます。Quaternion.identityは親の軸の回転に合わせるか、ルートの親(一番の親)である場合はワールド軸の回転していない状態と同じです。UpdateメソッドではQuaternion.Slerpメソッドを使って第1引数のQuaternion値を徐々に第2引数のQuaternion値に変更します。値は第3引数で指定した値で補間されます。第3引数の値は0~1の間の数値に変換され0であれば第1引数のQuaternion、1であれば第2引数のQuaternionと一致します。その間の数値であれば第1引数と第2引数の間のQuaternionが得られるという感じになります。今回の場合は第1引数のrigidBody.rotationの値がプレイヤーの方向を向くように変化していきますので、第3引数は回転スピードのrotationSpeedとTime.deltaTimeを掛けたものを指定しています。rotationSpeedを大きくしても最大で1にしかならないので1の場合はプレイヤーキャラクタの方向を完全に向いた回転を得られます。0.8f)の間の0~1の割合の0.04の回転を得られるという感じになります。イメージとしては以下のようになります。現在の砲身の回転はどんどん更新されていきますが、現在の回転と目的の回転の割合の0.04の部分の回転を取得している感じです。Quaternion.LookRotationは引数で指定した方向の回転を得られます。ここではプレイヤーの位置から砲身の位置を引いてプレイヤーの方向を指定していますので、プレイヤーの方向の回転が得られます。0f)と同じでそれに0.8fを掛けて補正値としています。これはplayer.positionはキャラクターの足元が基点となっているので、キャラクターのお腹の辺りに砲身を向ける為に補正値を加えています。FixedUpdateメソッドでは計算した回転にRigidbodyのMoveRotationメソッドを使って回転させています。これで砲身を回転させるスクリプトが出来ました。砲身はスクリプトからRigidbodyを介して回転させますのでRigidbodyコンポーネントを取り付けます。ComponentからPhysics→Rigidbodyを選択し取り付けます。CannonRotationScriptのRotatableにチェックを入れてみます。RigidbodyのIsKinematicにチェックを入れてスクリプトから操作するようにします。次は砲身から飛ばす弾のプレハブを作成します。Object→Sphereを選択し、名前をBulletとします。Bulletゲームオブジェクトを選択し、インスペクタで設定をしていきます。ComponentからPhysics→Rigidbodyを選択し取り付けます。TransformのScaleのXYZを全て0.2にします。Gravityのチェックを外し重力を働かせないようにします。次にAssets/Scriptsフォルダに新しくBulletScriptスクリプトを作成し、Bulletゲームオブジェクトに取り付けます。何らかのゲームオブジェクトに衝突したら消すDestroy(gameObject);}}attackPowerは与えるダメージです。gameManagerはGameManagerを入れます。StartメソッドではGameManagerゲームオブジェクトを探してGameManagerスクリプトを取得しgameManagerに入れています。10f);で弾が登場してから(Startメソッドが呼ばれてから)Destoryメソッドを使って自身のゲームオブジェクトを10秒後に消します。これは弾が登場してからずっと残っていても無駄で処理も遅くなっていくからです。OnCollisionEnterメソッドは弾のコライダに他のコライダが衝突した時に呼ばれるメソッドです。GameManagerのGameOverプロパティがtrueの時はゲームオブジェクトを削除してreturnでその後の処理をしません。その後衝突した相手のCollision型のcollisionのゲームオブジェクトのタグがPlayerだった時にそのゲームオブジェクトからPlayerControllerスクリプトを取得し、TakeDamegeメソッドを呼び出してダメージを与えます。その後、相手のRigidbodyコンポーネントを取得し、AddForceメソッドでtransform.forwardで弾の前方を取得し、その方向に力を加えています。オプションとしてForceMode.VelocityChangeを指定し、質量を無視してRigidbodyに即座に力を加えています。この処理は弾がプレイヤーに当たった時にプレイヤーを少し力で押す感じにしたい為に入れました。最後に、何らかのコライダと衝突した場合は弾を消したいのでDestoryメソッドで自身のゲームオブジェクトを消しています。弾は何らかのゲームオブジェクトと衝突したら消えますが、衝突しなくても最終的に10秒後には消えます。これで弾のゲームオブジェクトが出来上がりました。弾をプレハブにする弾のゲームオブジェクトが完成しましたが、大砲から弾を継続的に発射する予定です。たくさんの弾をヒエラルキー上に配置して飛ばすよりも、弾のゲームオブジェクトをプレハブにしておき、スクリプトから弾のプレハブをインスタンス化し、大量生産出来るようにした方が簡単です。Assetsフォルダに新しくPrefabsフォルダを作成し、ヒエラルキーのBulletゲームオブジェクトをドラッグ&ドロップします。これでAssets/PrefabsフォルダにBulletプレハブが出来ました。ヒエラルキーにあるBulletは使わないので削除してください。飛ばす弾のプレハブが出来たので次は定期的にBulletプレハブからインスタンスを生成し飛ばすスクリプトを作成していきます。Assets/Scriptsフォルダに新しくFireBulletScriptを作成しヒエラルキーのCannonの子要素のLaunchPositionゲームオブジェクトにドラッグ&ドロップして取り付けます。ForceMode.Force);}}gameManagerはGameManagerを入れます。bulletは先ほど作ったBulletプレハブをインスペクタで設定します。fireIntervalは次の弾を発射するまでの間隔時間です。powerは弾に加える力です。nowTimeは経過時間を入れます。StartメソッドではGameManagerゲームオブジェクトを探しGameManagerスクリプトを取得しています。Updateメソッドでは最初にゲームオーバーであればreturnでそれ以降の処理をしません。nowTimeにTime.deltaTimeを足していき、経過時間を計算します。経過時間がfireIntervalの時間以上になったらFireメソッドを呼んで弾を飛ばします。弾を飛ばしたら経過時間を0にします。FireメソッドではInstantiateメソッドを使ってbulletを自身の位置(LaunchPositionゲームオブジェクトの位置)と回転に設定してインスタンス化しそれをins変数に入れています。ins変数からGetComponentを使ってRigidbodyを取得し、AddForceメソッドを使ってtransform.forwardでLaunchPositionゲームオブジェクトの前方(青い矢印の方向)に力を加えています。ForceMode.Forceオプションは質量を利用して継続的に力を加えるモードです。LaunchPositionゲームオブジェクトのFireBulletScriptのBulletにBulletプレハブを設定します。これで大砲の機能が出来ました。大砲をプレハブ化する大砲の機能が出来ましたがゲームステージにいくつか大砲があることも考えられます。ヒエラルキー上で大砲をCtrl+Dキーで複製してもいいですが、どうせならプレハブにしておきましょう。Assets/PrefabsフォルダにCannonゲームオブジェクトをドラッグ&ドロップしてプレハブにします。今後大砲を追加したい場合はAssets/PrefabsフォルダのCannonプレハブをヒエラルキーやシーンビューにドラッグ&ドロップすることで配置出来ます。今回は3つの大砲を配置し、以下のようなTransformにしました。CannonとCannon(2)の子要素のBasePointOfTheBarrelのCannonRotationScriptのRotatableのチェックは外して回転しないようにします。シーンビューで見ると以下のような位置に配置されています。実行して確認してみる機能が出来たので実行して確認してみましょう。上のようになりました。大砲から定期的に弾が発射されていますね、また右の大砲の砲身はキャラクターの方向を向いて打ってきます。終わりに今回は弾を発射する大砲を作成しました。ゲームっぽくなってきましたね。(^_^)v次回はプレイヤーキャラクターにジャンプ機能を取り付けます。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事シンプルなアクションゲームを作ってみようシンプルなアクションゲームを作ってみよう26-シーン間の遷移を作成する-シンプルなアクションゲームでシーンを変更する機能を作成していきます。シンプルなアクションゲームを作ってみようシンプルなアクションゲームを作ってみよう19-ジャンプ機能を作成する-シンプルなアクションゲームのプレイヤーにジャンプ機能を取り付けていきます。二段階のジャンプも出来るようにします。シンプルなアクションゲームを作ってみようシンプルなアクションゲームを作ってみよう24-カウントダウン機能を作成する-シンプルなアクションゲームでゲームが開始する前にカウントダウン表示をして、ゲームを開始する前の準備が出来るようにします。シンプルなアクションゲームを作ってみようシンプルなアクションゲームを作ってみよう10-ゲームの舞台を作成する-シンプルなアクションゲームの舞台を作成していきます。シンプルなアクションゲームを作ってみようシンプルなアクションゲームを作ってみよう1-新しいプロジェクトの作成と完成品サンプルゲームの実行-シンプルなアクションゲームを作っていく為に、Unityの新しいプロジェクトの作成をします。完成したサンプルゲームを実行して確認が出来ます。シンプルなアクションゲームを作ってみようシンプルなアクションゲームを作ってみよう4-Unityエディターの操作に慣れる-Unityエディターでヒエラルキーでの操作やシーンビューでの操作に慣れる為にしていきますシンプルなアクションゲームを作ってみよう17-キャラクターのHPを表示する-シンプルなアクションゲームを作ってみよう19-ジャンプ機能を作成する-ホーム作ってみようシリーズシンプルなアクションゲームを作ってみようスポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なアクションゲームや、TPSゲームの作成までが出来ます。自作タイピングゲームタイピングゲームを作りました。WebGL形式なのでPCのブラウザで遊べます。以下からプレイ出来ます。FinalTypingUnityを使って作成したローマ字入力のタイピングゲームです。gametukurikata.com2022.01.02お知らせ2023/01/24個人的にUnity2022.2.3f1をインストールしました。2022/10/14UnityのIKを使って足の位置と角度を地面に合わせる機能Unityのゲームでキャラクターの両足が別の高さの地面の上にある時にそれぞれの足をそれぞれの地面につけるようにする機能を作成しますgametukurikata.com2016.04.11機能を少し修正しました。2020/09/19コメント欄は閉鎖しました。今までコメントを投稿してくださった方はありがとうございました。(^^)/2018/08/07わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。gametukurikata.com2019.08.01Unityを使い始めたばかりの人がつまづきやすい点を解消するUnityを使い始めたばかりの人が結構な確率で陥る不具合や疑問点を解消していきます。基本的にはブログに寄せられた質問への回答という感じです。gametukurikata.com2018.12.04も参照してみてください。小・中学生によるデジタルコンテンツ開発の全国大会ですuycc.unity3d.jp2022年大会の先行エントリーが開始されているようです。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。記事の内容に質問がある方へUnityを使った3Dゲームの作り方(かめくめ)の歩き方UnityのJavaScriptとC#を読み替えてどちらでも対応出来るようにするホーム検索トップサイドバータイトルとURLをコピーしました。