Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。9今回はカメラのレンズの中心からマウスクリックした位置に弾を飛ばす機能を作成します。20:53では銃口の先に弾を飛ばすという処理をやりましたが、それを少し変更する感じですね。↑のような機能を作成していきます。カメラのレンズが始まる位置から弾を飛ばすようにしています。↑のサンプルでは重力を働かせていませんが、重力を働かせた場合のサンプルも作成していきます。スポンサーリンク飛ばす弾の作成まずは飛ばす弾のプレハブを作成していきます。Object→Sphereを選択し、名前をBulletとします。Gravityのチェックを外し重力を働かせないようにします。BulletTestスクリプトを作成し取り付けます。BulletTestスクリプトはこの後作成します。弾に力を加えるBulletTestスクリプトBulletTestは弾が存在している間はRigidbodyに力を加えて飛ばす処理を記述します。ForceMode.Force);}}Awakeで自身に設定されているRigidbodyコンポーネントを取得しますOnEnableメソッドはゲームオブジェクトがアクティブになった時に呼ばれるメソッドです。Camera.main.ScreenPointToRay(Input.mousePosition)でカメラからマウスの位置までレイを飛ばしそれをrayに保持しておきます。弾のゲームオブジェクトがアクティブになってからdeleteTimeで指定した時間が経ったらDestroyで弾のゲームオブジェクトを削除します。弾自身のゲームオブジェクトと当たった相手のゲームオブジェクトを削除しています。FixedUpdateメソッドは固定フレームレートで呼ばれるメソッドで剛体(Rigidbody等の物理的な挙動)を使う時はこの中で処理をするといいみたいです。そんなわけでray.directionでカメラの位置からマウスの位置の方向を取得し、そこに力を加えています。Gravityにチェックを入れても効果の程が解り辛いです。そんな時はFixedUpdateで毎回力を加えるのではなく最初に強い力を加えてFixedUpdate処理をしないようにします。そこら辺の処理は最後にやりたいと思います。これで弾が出来たのでAssetsフォルダにドラッグ&ドロップしてプレハブにします。次に敵のゲームオブジェクトを作成します。今回は弾が物理的に当たるようにし、OnCollisionEnterで判定しているので、衝突対象も物理的に当たるようにします。Object→Cubeを選択し名前をEnemyとします。インスペクタのTagに新しくEnemyタグを作成し設定します。上のTagの部分をEnemyにします。出来たらCtrl+Dキーでコピーして位置を変えたりしていくつか設置しておきます。MainCameraに弾を発射するスクリプトを取り付ける次にカメラから弾のプレハブをインスタンス化して弾を発射させるので、新しくShotTestスクリプトを作成し取り付けます。GameObject;}}}インスペクタでbulletに弾のプレハブを設定します。offsetはカメラレンズからのオフセット値で、カメラレンズと同じ位置から弾を飛ばすと弾のゲームオブジェクトの中身が表示されてしまうので、それを回避する為に設定します。今回はZ軸の値のみ変更する為、floatにしてますが、Vector3型にして上下左右のオフセット値を指定する事も出来ます。Input.GetButton(“Fire1”)でマウスの左ボタンを押している間はメインカメラのビューポート(カメラの表示領域の横と縦を0~1の割合で現したもの)の中心+オフセット値を取得し、Instantiateで弾の位置をこのレンズの中心+オフセット値を指定します。ShotTestは↑のように設定しました。弾の衝突設定を変更するShotTestスクリプトでInput.GetButtonで処理をする為、ボタンを押している間ずっと弾をインスタンス化しています。その為、弾同士がぶつかって跳ね返ってしまいます。そこで、弾同士は衝突判定をしないように設定します。Settings→Physicsを選択します。MatrixでBullet同士のチェックを外し、お互いが衝突しないようにします。弾を撃ってからのフリーズ時間を作る現時点では弾はUpdateの度に実行されていますが、あまりに弾が連続して発射されても困るので1回弾を発射してから次の弾を発射するまでに一定時間が必要となるようにします。ShotTestに処理を追加します。0f;}}弾を飛ばしてからの時間(elapsedTime)が待ち時間(waitTime)を超えていなければその後の処理をしないようにします。することで弾を飛ばす間隔が広くなります。Gravityにチェックを入れ弾に重力を働かせるようにして確認してみます。BulletTestスクリプトのFixedUpdateメソッドで毎回力を加えているので重力の効果が解り辛いです。そこで力を加えるのは最初に1回だけにする事にしましょう。BulletTestスクリプトを修正します。(col.gameObject);}}}FixedUpdateメソッドを削除し、OnEnableメソッド内で力を1回加えます。力を加えるのが1回だけになったので、BulletTestで設定するpowerを上げます。それでは確認してみましょう。↑のようになりました。弾に与える力の調整をする事で、放物線を描いて飛ぶ弾にすればちょっとした的当てゲームの作成も出来そうですね。(^^)/終わりに今回の処理では弾を飛ばす度に弾のプレハブをインスタンス化していますが、弾をあらかじめインスタンス化しておき、それを再利用(プール)する方法もあります。毎回弾をインスタンス化したり削除したりといった事をしないので、メモリの読み書きの節約やガベージコレクションの発生が抑えられます(らしいです)。それは次回以降やってみたいと思います。距離);等とすればカメラの位置からカメラの前方×距離の位置までのRayが得られます。弾自身に力を加えるスクリプトを設定しないのであれば、カメラ自体にスクリプトを取り付けそこでRigidbodyを取り付けた弾に力を加えるという方が簡単かもしれません。deleteTimeOfBullet);}}}カメラにスクリプトを取り付けたので、弾のプレハブをインスタンス化する時にカメラの位置と角度を指定し、その弾に設定しているRigidbodyを取得し、カメラの前方に力を加えています。21:15この記事中の「MainCameraに弾を発射するスクリプトを取り付ける」の項目にあるようにカメラの中心+カメラの描画の最初の位置+補正値であれば特別に位置を調整する必要はありません。カメラの位置(transform.position)を使って弾の発射位置を変更したい場合はhttps://gametukurikata.com/basic/transformproperty上の記事の「Vector3とTransformのStatic変数について」の項目にあるように、指定したゲームオブジェクトの前方(transform.forward)を使うと実現出来ます。0.5fでカメラの前方0.5mの位置が取得出来ますので、この位置に弾をインスタンス化してみてください。21:18deltaTimeはUnityマニュアルで最後のフレームを完了するのに要した時間でUpdate1回の処理時間が計算出来るのでそれを足していくので、オフラインのゲームであれば個人のPCの処理速度の違いはあっても計算は出来てると思いますが、deltaTime以外ではコルーチンを使って時間経過で何かを実行する事も出来ます。DateTimeを使うと標準時から計算出来そうですが、実際に作っていないのでなんとも言えません。それともオフラインではなくネットワークゲームでのイベント処理の時間をローカルプレイヤー全部で同期したいということですかね?ネットワークゲームの場合はサーバーにデータを保存して出来るゲームの場合はサーバーの時間を元にしてイベント発生の処理をしているんじゃないですかね?UNET等のリアルタイム型のゲームの場合はホストの経過時間に合わせるとか、「ホストの経過時間+ローカルからホストまでの通信時間」を計算して時間を同期させるとか。21:36ありがとうございます。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。サイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事への質問はコメント欄にお願いいたします)。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。21:43の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なTPSゲームの作成までが出来ます。Д`)シクシク...お知らせ2020/02/15個人的にUnity2019.3.1f6をインストールしました。2020/01/31個人的にUnity2020.1.0a21(アルファ版)をインストールしました。2018/08/07コメント欄へのわたくしの返信は停止しております。わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。21:41も参照してみてください。コメントの返信はありませんが、回答は記事に反映されている可能性があります。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。Unityを使った3Dゲームの作り方(かめくめ).。