Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2018.08.16今回はUnityの3Dアクションゲーム等でキーボード等で移動しているキャラクターが車や飛行機の近くに寄って、特定のボタンを押した時に移動手段である車等に乗って移動する機能を作成していきます。通常の移動をしているキャラクターを乗り物に乗せて動かすなんて難しそう!と思われるかもしれませんが、車でキャラクターを移動させるだけに限って言えば簡単です。今回は大雑把な機能の作成をし、細かい部分は記事内で紹介する他の記事を参照してみてください。上のような感じのものが出来上がります。車に乗り込むアニメーション等は割愛し、キャラクターが車と移動出来るという機能に特化します。その為、上のような車の上にキャラクターが乗っている状態になっています。(-ω-)/スポンサーリンクキャラクターを乗り物に乗せて動かす機能の概要まずはキャラクターを乗り物に乗せ、その乗り物と一緒にキャラクターを動かす為にはどうするか?を考えていきます。車に乗せる車にキャラクターを乗せるには車の子要素にキャラクターを検知する範囲を用意し、その範囲内にキャラクターがいる時に特定のボタンを押したらキャラクターを車の子要素に設定します。実はキャラクターを車の子要素にするだけで車の動きに合わせてキャラクターも移動します。UnityのTransformのワールド空間とローカル空間についてUnityのTransformのワールド空間とローカル空間について見ていき、ワールド空間とローカル空間の変換を行ってみます。gametukurikata.com2017.05.09キャラクターが車と相対的に動くわけですね。特定のボタンを押したらキャラクターを車の子要素にすると書きましたが、その前にいくつかやる事があります。車に乗り込むアニメーションと車の位置を合わせる例えば車に乗り込むアニメーションをして車の中に入る場合は、キャラクターに車に乗り込むアニメーションをさせ運転席に座ってハンドルを持つようにする必要があります。(キャラクターのアニメーションはBlender等で実際の車のモデルに合わせて作成すると良さげですね)。ここで必要なのがキャラクターのアニメーション動作と運転席に座る位置とを合わせることです。これにはターゲットマッチングを使用すると出来ます。Unityでアニメーションの動きに合わせてキャラクター位置を決定するUnityでキャラクターのアニメーションの再生位置に合わせて手や足の位置を壁などに合わせる機能を作成します。ジャンプして山に手をつけ乗り越えるといった動作をさせたい時等にこの機能を使うとうまく出来ますgametukurikata.com2016.05.05今回はそこら辺の細かい部分は作りませんが、以前ターゲットマッチングを使用して作成した機能があるので、興味がある方はUnityで一人用フリーフォールを作ってみましたUnityで一人用フリーフォールを作成し、キャラクターが乗る事が出来るようにしてみました。Ethanにはかわいそうですがフリーフォール体験をして頂きましょう・・・・(-.-)gametukurikata.com2017.07.31を参照してみてください。キャラクターのコライダが車のコライダと衝突する車に乗る前のキャラクターはキーボード等の操作で動かす為、コライダを使って地面などとの衝突判定を行っています。車に乗り込む時にキャラクターのコライダがあると車のコライダと衝突してしまう為、車に乗り込む時にはキャラクターのコライダをオフにします。最後に車に乗ったら車を降りるという機能も作成しなければいけません。そこで車のスピードが一定の速度以下になったら車を降りれるようにし、またキャラクターのコライダを有効にし普通に移動出来るようにします。キャラクターが車を降りた時に車の移動機能は無効にします。今回の場合はスタンダードアセットの車を動かす機能を使いますのでそちらの移動機能を無効にします。機能の作成キャラクターを車に乗せる為の概要がわかったので、実際に機能を作成していきましょう。スタンダードアセットの車を配置まずはスタンダードアセットにあるCarを地面の上に配置します(地面はTerrainやPlane等で作っておきます)。StandardAssets/Vehicles/Car/PrefabsにあるCarをヒエラルキー上にドラッグ&ドロップします。Carには既に車のモデルと車を動かす機能が取り付けてあるので後はキャラクターが車に乗れる範囲とその際のスクリプトを作成するだけです。スタンダードアセットの車についてはUnityのスタンダードアセットのCarを使って車で地面を走るUnityのスタンダードアセットのVehiclesにあるCarの設定を見ていき、実際に車で地面の上を走ってみます。gametukurikata.com2017.09.23を参照してください。自作の車モデルを使う場合はUnityで自作の車モデルに設定を施し、地面を走らせるBlenderで作成した自作の車モデルに、UnityのスタンダードアセットのCarプレハブの設定をコピーし、自作の車モデルで地面を走ってみます。gametukurikata.com2017.09.28を参照してください。車は最初はキーボード操作等で動いては困るのでCarUserControlスクリプトを無効化しておきます。キャラクターが車に乗り込む事が出来る範囲の作成Carの子要素に空のゲームオブジェクトを作成し、名前をCarStandとします。Triggerにチェックを入れて物理的に当たらないようにします。ActivateCarScriptという名前の新しいスクリプトを作成し取り付けます。車に乗り込む為のスクリプトActivateCarScriptの記述ActivateCarScriptは車に乗り込む事が出来る範囲内にキャラクターがいる時に指定のキーを押したら車に乗り込む為の処理をするスクリプトです。false;}}フィールドでは車にキャラクターが乗る時と降りる時で使用するコンポーネントを設定出来るようにしておきます。isActiveCarはキャラクターが車に乗っているかどうかのフラグです。carUserControlは車をキーボード等で操作する時の処理をしているのでそれを有効・無効を切り替えて操作の切り替えをします。rigidは車を動かす時にRigidbodyを使用しているのでキャラクターが車を降りる時にRigidbodyのIsKinematicを有効にし、物理的に作用しないようにします。OnTriggerStayメソッドでは車に乗り込む範囲内にキャラクターがいる時で車に乗り込んでいない時にマウスの左クリックをしたら車に乗り込む処理であるRideInCarメソッドを呼び出します。実際には車の中には入らないのでRideOnCarにした方が良さげですが・・・・(^_^;)今回はマウスの左クリック(厳密にはFire1に割り当てられたボタン)でキャラクターが車に乗り込みますが、最初はSpaceキー(Jumpキー)で行うようにしていました。Spaceキーは車のハンドブレーキのキーと被ってしまっていて車に乗り込んだ後に前に進めないという不具合に見舞われたため変更しました・・・(^_^;)RideInCarメソッドではキャラクターの操作スクリプトであるVehicleCharaのSetStateメソッドを呼び出し、キャラクターの状態の変更とCarのTransform情報を渡しています。車に乗り込む時に車の操作スクリプトであるcarUserControlと車に乗り込む範囲のcarStandColliderを無効にしています。RigidbodyのIsKinematicも無効にし、Rigidbodyの物理的な作用を働かせます。GetOffCarメソッドはキャラクターが車から降りる時に呼び出される処理です。車のコントロールをオフ、乗り込む範囲のオン、IsKinematicのオン、isActiveCarのオフをしています。スクリプトの作成が終わったらCarStandのインスペクタでActivateCarScriptにCarUserControlスクリプト、CarStandのコライダ、CarのRigidbodyを設定します。これで車の設置が完了しました。次はキャラクターを作成していきます。キャラクターのモデルにはスタンダードアセットのEthanを使用し、CharacterControllerコンポーネントの取り付け、AnimatorControllerの作成をしておきます。EthanのインスペクタでTagにPlayerを設定しておきます。AnimatorControllerではIdleとWalk状態を作成し、アニメーションパラメータのWalkSpeedで状態が遷移するようにしておきます。細かい部分はUnityのアニメーションの切り替えシステムとスクリプトUnityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。gametukurikata.com2016.01.20の記事等を参照して作成してください。キャラクター操作スクリプトの作成キャラクターであるEthanにVehicleCharaという名前の新しいスクリプトを作成し取り付けます。スクリプトが長いので分割して解説します。State.normal;}}スクリプト内で使用するCarControllerスクリプトはUnityStandardAssets.Vehicles.Carパッケージで定義されているのでusingディレクティブを記述しておきます。キャラクターの状態であるStateにはnormal、rideCarの二つの状態を作成します。ridePositionは車に乗った時の車からの相対位置を指定します。今回は車の上に乗るような位置を設定しています。UpdateメソッドUpdateメソッドではキャラクターの状態に応じて処理を分岐しています。スピードが速すぎる時はコンソールに速度表示Debug.Log(transform.parent.GetComponentInChildren<CarController>().CurrentSpeed);}}}}キャラクターがState.normal(通常)の状態の時はただの移動処理をしているだけなので割愛します。State.rideCar状態の時でマウスの左クリックを押した時はキャラクターの親の要素から子要素に向けてCarControllerスクリプトを検索し、CurrentSpeedプロパティで車の速度を求めています。0.5より下の速度だったらキャラクターの状態をState.normalにし車から降りる処理をします。CarControllerスクリプトをキャラクターの親の要素から検索しているのは、キャラクターが車に乗っている時はキャラクターを車の子要素にしている為、いったん親のCarに戻ってから子要素のCarControllerスクリプトを検索しています。車の速度が0.5以上であったら確認の為にコンソールに車の速度を表示しています。SetStateメソッドSetStateメソッドではキャラクターの状態変更時の処理をしています。乗るのと降りるキーを同じにした為、入力をリセットする必要があるInput.ResetInputAxes();}State.rideCarに状態を変更した時は車に乗っている状態にするのでキャラクターのコライダの無効化、アニメーションパラメータのWalkSpeedを0にしIdle状態へ遷移させます。引数で受け取ったCarをキャラクターの親に設定する為、SetParentメソッドで親を設定します。キャラクターの向きはCarが向いている方向の角度をQuaternion.LookRotationで求め、キャラクターの角度をその角度に指定します。キャラクターは既にCarの子要素になっているのでCarの位置から相対的にridePosition分を移動しています。State.normal状態の時は車から降りる状態なので親からActivateCarScriptを検索しGetOffCarメソッドを呼び出して車を降りる時の処理をします。キャラクターの位置はCarStandの位置にし、SetParentメソッドにnullを渡し車との親子関係を解除しています。車を降りたら通常通りキャラクターを動かせないと困るのでCharacterControllerを有効にします。車を乗る時と降りる時に押すべきボタンをFire1で統一している為、このままだと車に乗った瞬間に車を降りる処理が実行され車に永遠に乗れません・・・・(^_^;)そこでInput.ResetInputAxes()メソッドを実行し、1回のUpdate内の処理でのキー操作をリセットし、連続して乗る→降りるという処理を1回のUpdateで実行しないようにします。これでキャラクターが車に乗る機能が完成しました!終わりに実はキャラクターが車から降りる前にブレーキ(進行方向と逆のキーボードの↓のキー等)を押してブレーキランプを点灯している時に車から降りるとブレーキランプが点灯したままになります。これは面倒くさいので対処しませんでした。(-_-)Carの子要素のSkyCarの子要素のSkyCarBrakeLightsGlowのMeshRendererコンポーネントのオン・オフでこのブレーキランプの点灯を操作しています。そこら辺を車を降りた時に必ずオフにするような処理を作ればブレーキランプ問題も解決しそうです。ブレーキランプを点灯しているスクリプトはSkyCarBrakeLightsGlowに設定してあるBrakeLightスクリプトで行っており、車のブレーキの入力値が0以上の時に常にMeshRendererを有効にしています。ここら辺も少し処理を変えないとうまくいかないようですね。(^_^;)あとは最初に車のRigidbodyのIsKinematicのチェックを外しておくとキャラクターとの接触で車が動いてしまう事があります。今回の機能はUnityで一人用フリーフォールを作ってみましたUnityで一人用フリーフォールを作成し、キャラクターが乗る事が出来るようにしてみました。Ethanにはかわいそうですがフリーフォール体験をして頂きましょう・・・・(-.-)gametukurikata.com2017.07.31の機能を簡略化したものなので、細かい部分は「一人用フリーフォール」の記事を参照してみてください。「乗り物にキャラクターを乗せて動かす」という機能が結構簡単に作れるのがわかりましたね。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事プログラムUnityのコンソールに表示されるスクリプトの警告文の内容を見て修正するUnityのコンソールタブに表示される警告の意味を理解し、警告表示をなくしていきますプログラムUnityで敵キャラが主人公に近づいた時に攻撃をしてくる機能Unityで敵キャラが主人公に近づいた時に攻撃をしてくる機能を作成していきます。プログラム主人公が乗ると数秒後に落下する床をUnityで作成してみるUnityのゲームで主人公キャラクターが乗ると数秒後に落下する床を作成してみますプログラムキャラ操作をCharacterControllerからRigidbody+コライダに変更するUnityでキャラクターを操作する時CharacterControllerを使ってきましたが、物理的な影響を得る為にRigidbody+CapsuleColliderでキャラクターの移動、ジャンプ、坂や段差を登れるようにしてみます。プログラムUnityで空中にいる時、着地時のアニメーション切り替えをする機能Unityのアクションゲーム等で高い所から落下した時は落下アニメーション、また着地する時には着地アニメーションを再生するような機能を作成していきます。プログラムUnityでゲームの中断が出来るようにするUnityのゲームで一時中断してポーズ画面を表示をする機能を作成していきます。Unityのパーティクルシステムの詳細とサンプルUnityで他のゲームオブジェクトとの距離を計算するホームプログラムスポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。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をコピーしました。