Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2今回は、今まで何となく使っていた重力の計算を考えてみようと思います。物理の計算とか考えるだけでも疲れてしまいますが・・・、重力値の加味に関してあいまいに使っていたので、検証して正しく使ってみる事にします。ゲームの世界なのでリアルな重力を働かせなくてもそれらしい重力を使っても問題ありません(._.)スポンサーリンク今までの重力計算が正しいか検証するまずは今までやってきていた重力値の計算が正しく出来ているのかどうかを検証してみます。重力値の計算はCharacterControllerでキャラクターを動かしている場合は自分で計算しなければいけません。この自分で計算という部分で間違いが混入してしまいがちです。Gravityにチェックを入れるだけで、キャラクターに勝手に重力を加味してくれます。いう事で、ヒエラルキー上に二つの3DオブジェクトのCubeを作成し、スクリプトから重力値を計算するCubeをScriptCubeRigidbodyの自動重力計算機能を使うCubeをRigidCubeという名前をつけます。ScriptCubeがRigidbodyCubeと同じように落下すれば正しくスクリプトが組めているという事になります。ScriptCubeには上のようにGravityという新しいスクリプトとCharacterControllerコンポーネントを追加します。Gravityスクリプトは後で作成します。Gravityにチェックを入れます。今回は落下だけを計算するので、回転や横への移動などはさせないようチェックを入れます。わかりやすいようにScriptCubeの色を赤色、RigidCubeの色を青色にしました。今までの間違っていた重力計算スクリプトScriptCubeに設定するGravityスクリプトを作成します。Time.deltaTime);}}上のUpdate関数内の処理がわたくしがよくやっていた処理です。Updateが呼び出される度に移動距離をリセットし、そこに重力値(Physics.gravity.y)を足して最後にTime.deltaTimeをかけて1秒間の速さを計算しCharacterControllerの機能を使って移動させます。Unityの実行ボタンを押して試してみます。青色のRigidbodyに比べ赤色のスクリプトで計算した重力の方はやたら落ちてくるのが遅いです。そもそも重力値(Physics.gravity.y)に1秒間辺りのTime.deltaTimeをかけていないのでおかしい事になっているんですが・・・、ただでさえ落ちるのが遅いのにTime.deltaTimeをかけたらさらに遅くなります。(^_^;)そもそも重力はどうやって計算してるのか?という所を考えなきゃいけません。時間なのでCharacterControllerのMoveの引数に渡す速度の所に落下速度を加えなければいけません。Time.deltaTimeは前回Updateメソッドが呼ばれてからの時間での落下速度なので、この瞬間の落下速度(Update1回での落下速度)を計算しているに過ぎません。その為、毎回Updateメソッドで計算したY軸の速度は足さなければいけません。velocityをVector3.zeroで毎回0に初期化していると、前回計算した落下速度のデータが消えてしまう為、落下速度を表す事が出来ません。今までの重力の計算は完全に間違っていました!(+_+)重力を正しく計算したスクリプトということで、Updateでyの値を初期化せず、Physics.gravity.yにTime.deltaTimeをかけた処理に変更します。Time.deltaTime);}}落下速度は時間経過と共に足していく必要があります。トータルの落下時間を別途作成するとよりわかりやすい処理になります。Time.deltaTime);}}こちらの場合は落下時間を足していき、速度のY軸は+=ではなく=にしています。それでは確認してみます。上のように重力がかかるタイミングが違うので多少ズレていますが、同じ速さで移動しているのがわかります。重力について検証してわかった事ですが、今までの重力の計算をしていた処理が全部間違っていました。(^_^;)移動速度ではなく距離と考えてスクリプトを組んでいたのがそもそも間違っていたのかも。今回は重力加速度が9.8↓にかかるという風に現実的な重力で計算していますが、ゲームに合わせて重力値を変えたり、そもそも重力を使わないという選択肢もあります。Physics.gravity.yを使わなくても数値として-3.0fの重力加速度を加えたりしてもいいわけです。ゲームに合わせて変更してください。-10)と全く一緒に落下します。(speedx,speedy);}}FixedUpdateで更新すると、Physicsによる落下とズレないようです。Gravityと同じタイミングで実行されるのでタイミングのズレはなくなりますね。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。サイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事への質問はコメント欄にお願いいたします)。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ゲームの作り方(かめくめ).。