Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。コピー2019.01.22今回はUnityのRPG等で操作キャラクターの移動と村人等と会話する時の処理を切り分ける機能を作ってみたいと思います。́Д`)2019年初のUnity関連記事なので、一応決めた通り今年の顔文字を使ってみました(謎)キャラクターは村人と会話する時は礼儀正しく村人の話を聞き終わるまで動かないようにします。以前作成した記事で人と会話する機能を作りましたが、そちらは人の範囲内に入ったら一言コメントのようなものを表示し、範囲外に移動したらそのコメントを消すというものでした。Unityのゲームキャラクター操作をすべてマウス操作で行うUnityのゲームで使用するキャラクターの移動やカメラの回転、カメラのズーム機能、カメラの壁対策、人との会話、敵を攻撃等のすべてをマウス操作で行う為の機能を作成していきます。gametukurikata.com2016.09.19今回の場合は主人公が村人の範囲内に入った時にアクションボタンを押したら会話が開始され、その会話が終わるまで主人公は動かないようにします。村人の範囲内にいる間はアクションボタンを押せばいつでも同じ会話を聞くことが出来るようにしていきます。上のようになりました。村人の会話範囲がかぶっていてもどちらかが会話していれば他の人は会話する事が出来ないようになっています。スポンサーリンク主人公キャラクターの行動処理を分ける主人公キャラクターにはCharacterControllerコンポーネントを取り付けコライダのサイズを調整し、AnimatorにAnimatorControllerを設定しIdle状態とWalk状態を作っておきます。ここら辺はUnityのアニメーションの切り替えシステムとスクリプトUnityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。gametukurikata.com2016.01.20等を参考に作成してください。Idle→WalkへはアニメーションパラメータWalkSpeedが0.1より大きく、Walk→IdleへはWalkSpeedが0.1より小さくなった時に遷移するように作っておきます。主人公キャラを選択し、インスペクタのTagにPlayerを設定しておきます。主人公キャラクターにMoveAndTalkCharaスクリプトを作成し、取り付けます。キャラクターの状態を列挙型で作成キャラクターが通常移動している状態と村人と会話している状態を列挙型で作成し、キャラクターがその状態を保持出来るようにします。CharacterState.normal;}}主人公キャラクターの状態をcharacterStateに保持するようにします。Updateメソッドで行動処理を分けるキャラクターの移動や会話等の動作はUpdateメソッドで処理するので、そこで行動処理を分けます。Time.deltaTime);}キャラクターの状態がノーマルの時はMoveメソッド、会話の時はTalkメソッドを呼び出すようにします。移動時も会話時もキャラクターにかかる重力は同じなのでどちらの処理でも実行されるようにします(空を飛ぶ行動処理も分ける場合は個別MoveやTalk等の行動処理メソッド内で重力計算をした方がいいかも)。MoveとTalkメソッドUpdateメソッドでMoveとTalkメソッドを呼び出しているので、その中身を記述します。{}Moveは移動キーを押された時の移動処理を記述し、Talkメソッドは特に何もやる事がないので空にしています。会話の終了は村人がいいと言うまで離さないという事で村人側から主人公の状態を変更します。会話中に何らかの処理をしたい時はTalkメソッドに記述するようにします。移動処理の詳細については、Unityでキャラクターの移動をプログラミングしてみるUnityで3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。gametukurikata.com2016.01.20を参照してください。主人公の状態を取得したり、状況に応じて切り替える必要があるので、その為の処理を記述します。0f);}}キャラクターの状態は列挙型のCharacterState型で取得出来るようにし、状態を設定する時もCharacterState型で設定します。キャラクターの状態を設定する時に会話中に状態を変更したら移動速度であるvelocityを0、アニメーションパラメータ―のWalkSpeedを0にし、その場でIdleに設定したアニメーションが再生されるようにします。これで主人公キャラクターのスクリプトが完成しました。会話表示用UIを作成する村人と会話中に表示するUIを作成します。ヒエラルキー上で右クリック→UI→Panelを選択します。ヒエラルキーでPanelを選択し、矢印をドラッグして会話を表示する領域の幅を調整します。Panelを選択した状態で右クリック→UI→Textを選択し、Panelの子要素にTextを作成します。実際の会話はこのTextに表示されるので、Panelより少し内側に文字列が表示されるようにTextを変更します。TextのサイズはPanelのサイズに応じて変更し、上下左右に10のマージンを設定します。会話は左上から表示したいので、Alignmentで左上を設定します。会話ウインドウは初めは表示させない為、Canvasを選択しインスペクタで名前の横のチェックを外し非アクティブの状態にしておきます。これで会話ウインドウが出来上がりました。主人公キャラクターが出来たので、会話相手である村人を作成します。村人のモデルはEthanを使うことにします。Emptyを選択し、名前をTalkAreaとします。Triggerにチェックをして物理的に当たらないようにし、Radiusを調整して会話範囲を設定します。村人の会話用スクリプトの作成TalkAreaには新しくVillagerTalkスクリプトのを作成し取り付けます。実際の会話表示機能はUnityでRPGゲームのメッセージ表示機能を作るUnityでロールプレイングゲームのメッセージ表示機能を作成していきます。RPG以外でキャラクターの発言を表示したりする時にも使えますgametukurikata.com2016.03.18で作成したものをVillagerTalkスクリプトに修正と追加をして使用します。VillagerTalkスクリプトに主人公と会話を開始する処理を記述します。フィールド等の作成まずはフィールド等の記述です。isTalk;}talkUIには先ほど作成した会話表示UIのCanvasを指定します。主人公キャラクターの状態を取得したりする為、インスペクタで主人公操作スクリプトを設定します。現在村人と会話中かどうかをisTalkで判断します。isTalkは主人公操作スクリプトのGetStateで主人公の状態がTalk状態か判断すればいらないかもしれません。次に主人公が村人の会話範囲内にいる時の処理です。1フレームに何度もキー押し判定されないようにリセットInput.ResetInputAxes();}}}}主人公が村人の会話範囲内にいる時はいつでも会話を開始出来るようにする為、OnTriggerEnterではなくOnTriggerStayを使ってマイフレーム主人公が範囲内にいることを検知出来るようにします。範囲内にいるコライダのタグがPlayerだった時にその後の処理を行います。主人公キャラクターが会話状態の時は新しく会話は出来ないものとし、returnでその後の処理は行いません。主人公が会話状態でない時にInputManagerで設定したActionに対応するボタンを押した時に会話を開始します。わたくしの場合はPS3コントローラーの〇ボタンをActionに割り当てました。InputManagerの設定に関しては、UnityでPS3コントローラー(ゲームパッド)に対応して動かしてみるUnityのゲームでPS3コントローラー等のゲームパッドを使用してみます。パソコンのゲーム用コントローラーを持っていない人は便利かもしれませんgametukurikata.com2016.05.07等を参照してください。会話を開始する時はInitializeTalkメソッド(この後作成します)を呼び出し会話の初期化処理を実行します。その後Input.ResetInputAxesメソッドを呼び次フレームではキーの判定を解除します。この処理が必要かというと、OnTriggerStayはマイフレーム呼ばれる為、Input.GetButtonDown(“Action”)のボタンの判定が複数フレームに渡って判断されてしまう可能性がある為です。その為、ボタンの判定をした場合は一旦Input.ResetInputAxesメソッドを呼んでボタンの判定をリセットしています(ボタンを押しっぱなしの場合は次フレームは軸の入力が0になり、その次のフレームでは軸の入力が判定されます)。PS3コントローラー等のジョイスティックの斜め判定は問題ないんですが、キーボードの矢印キーで上と右を同時押しして斜め移動していた場合はうまく動作しませんでした(わたくしの環境のせいかも?)。開始する時に一旦状態をリセットする為のメソッドを作成します。true;}isOneMessageとisEndMessageは先ほどのリンク先のRPGメッセージを表示する記事のフィールドです。それ以外は会話用UIのアクティブ化、会話をする時の初期化処理をしているだけです。以前作成したUnityでRPGゲームのメッセージ表示機能を作るUnityでロールプレイングゲームのメッセージ表示機能を作成していきます。RPG以外でキャラクターの発言を表示したりする時にも使えますgametukurikata.com2016.03.18で作成した記事を今回のVillagerTalkスクリプトに組み込む場合はいくつか改造する必要があります。村人を複数設置する場合に固定の会話では困るので、インスペクタで村人それぞれの会話を設定出来るようにします。10)]アトリビュートを付け最低1行で最大10行のテキストエリアとします。会話内容が多い場合は10の部分を変更して行数を多くしておきます。"";SetMessage(talkMessage);}StartメソッドではSetMessageメソッドの呼び出し時の引数にtalkMessageを渡します。次に、Updateメソッド内の修正部分です。false;moveAndTalkChara.SetState(MoveAndTalkChara.CharacterState.normal);}Input.ResetInputAxes();}}}中身の元の機能のままでマウス操作だった部分をActionボタンの割り当てに変えたり、マイフレームの判断を避ける為にInput.ResetInputAxesメソッドを追記したりしています。会話が終了した時は主人公の状態をノーマル状態に変更しています。村人は自分の会話が終了したら主人公の状態を変えるので、村人は会話が終了するまで主人公を逃さないという事になりますね。́Д`)Villagerの子要素のTalkAreaのインスペクタはのようになります。TalkUIには会話用UIの親であるCanvasを指定し、MoveAndTalkCharaには主人公のMoveAndTalkCharaスクリプト、MessageTextには会話用UIのTextを設定します。́Д`)これで会話する村人が出来ました。村人を増やす村人であるVillagerが出来たので、Villagerを選択した状態でCtrl+Dキーを押して複製し、マテリアルを変更して別の村人を作成します。村人のモデルを変更する場合は空のゲームオブジェクトを使って親を空のゲームオブジェクトにして村人を作成しておくと便利かもしれません。Unityでの空のゲームオブジェクトの使い方Unityでの空のゲームオブジェクトの使い方について。Emptyで空のゲームオブジェクトを作る事が出来ますが、その使い道について考えます。gametukurikata.com2017.05.10別の村人を作成したら配置します。上のように村人の会話範囲になっています。これで機能が完成しました。終わりに久しぶりの記事という事で、機能の説明の仕方を忘れ、ますます分かり辛い説明になってきたような気がしますね。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事プログラムUnityスクリプトからJavaScriptの関数を呼び出すUnityスクリプトからJavaScriptの関数を呼び出してみます。プログラムUnityで空中にいる時、着地時のアニメーション切り替えをする機能Unityのアクションゲーム等で高い所から落下した時は落下アニメーション、また着地する時には着地アニメーションを再生するような機能を作成していきます。プログラムUnityのアクションゲームで照準をマウス操作で動かすUnityのゲームでマウスカーソルを照準画像に変更し、マウスクリックで敵を倒す事が出来るようにしますプログラムUnityのゲームキャラクター操作をすべてマウス操作で行うUnityのゲームで使用するキャラクターの移動やカメラの回転、カメラのズーム機能、カメラの壁対策、人との会話、敵を攻撃等のすべてをマウス操作で行う為の機能を作成していきます。プログラムUnityで基本的な数学・物理学を使った処理Unityでゲームを作る際に数学や物理の知識がなくてもゲームを作ることは出来ます。数学や物理の知識があるとよりリアルなゲームを制作する時に役立ちます。そこで基本的な数学や物理を使って計算をし砲台から弾を飛ばす機能を作成してみます。プログラムUnityの敵キャラクターが目的地に到達出来なければ違う場所を目的地にするUnityの敵キャラクターが目的地に到達出来なければ違う場所を目的地にするブログが4年目に突入C#で正規表現を使って文字列処理をするホームプログラムスポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。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をコピーしました。