- 投稿日:2019-02-15T23:41:54+09:00
[Unity] 重力を変更する
1.ゲーム全体の重力を変更する方法
ゲーム全体の重力を変更するには、
Edit→Project Settings→Physicsを開いて、InspectorのPhysicsManagerのGravityのVector3の値を変更するだけです!
デフォルトではy軸に-9.81 m/s^2 の力がかかっていますね。地球と同じです。2.特定のオブジェクトのみ重力を変更する方法
特定のオブジェクトに違う重力をかけたい場合は、
以下のコード(ChangeGravity.cs)をオブジェクトにアタッチして、using System.Collections; using System.Collections.Generic; using UnityEngine; public class ChangeGravity : MonoBehaviour { [SerializeField] private Vector3 localGravity; private Rigidbody rBody; // Use this for initialization private void Start () { rBody = this.GetComponent<Rigidbody>(); rBody.useGravity = false; //最初にrigidBodyの重力を使わなくする } private void FixedUpdate () { setLocalGravity (); //重力をAddForceでかけるメソッドを呼ぶ。FixedUpdateが好ましい。 } private void setLocalGravity() { rBody.AddForce (localGravity, ForceMode.Acceleration); } }Inspectorから好きなVector3を入力してあげればOKです。
以上、重力を変更する方法でした。
- 投稿日:2019-02-15T22:42:03+09:00
GetComponentの基本を理解する
はじめに
1から勉強すると必ず出るメソッドです。写経を行いテキストの指示通りにやればほぼうまくいきます。しかしこれらを繰り返していくといざ説明する時に、何も理解をしていない事に気が付きました。テストを繰り返していくうちに理解できるようになったので、記事にします。
Componentとは
Inspectorに表示されているTransform以下の各々の情報。AddComponentでGameObjectで使うコンポーネントを追加します。GetComponentはこれらの情報を変数に割り当てることで、自由に設定できます。
スクリプト
public class CylinderRotate : MonoBehaviour { float time; void Update() { time += Time.deltaTime; //timeを加算し続ける var ren = GetComponent<Renderer>(); //コンポーネントRendererを取得 var col = GetComponent<Collider>(); //コンポーネントColliderを取得 var tra = GetComponent<Transform>(); //コンポーネントTransformを取得 tra.Rotate(10f, 0, 0); //GameObjectoを回転させる。 if(time >= 0) //timeが0秒経過 { col.enabled = true; //Colliderを真 ren.enabled = true; //Rendererを真 } if(time >=2) //timeが2秒経過 { col.enabled = false; //Colliderを偽 ren.enabled = false; //Rendererを偽 if (time >=4) //timeが4秒経過 { time = 0; //timeを0にする。 } } } }上のスクリプトを打ちこんで、3Dオブジェクトにアタッチする。
結果
感想
今までコンポーネントの使い方は理解をほとんどしていなかったが、ロックマンのような足場を消す・現れるの繰り返しを作ってみたことで、理解が大分進んだと思う。
- 投稿日:2019-02-15T19:36:23+09:00
[Unity] GridLayoutGroup入門 図鑑的なもの作成 ScrollView
今回はUnityのUIにおいて超便利な機能、GridLayOutGroupについて解説します。
今回はScrollViewにGridLayoutGroupを使って、
よくゲームで見るこんな感じの図鑑のように、画像などを等間隔に表示することが簡単にできます!
UnityでScrollViewを作る
CanvasScalerのUIScaleModeをScale with screen sizeにして、
Create→UI→Scroll ViewからScroll Viewを作りましょう。
AnchorPresetsから右下のStretchを選び、RectTransformの全ての値を0にしてCanvasと同じ大きさにしましょう。
(Stretchは親オブジェクトから何ピクセル離れるか、というイメージです。今回は全て0にしているので親オブジェクトと同じ大きさですね)
これで画面いっぱいにScroll Viewが表示されました。今回は縦方向の移動だけで良いとするので、Scroll RectのHozirontalのチェックを外して、Scrollbar horizontalのオブジェクトも削除しちゃいましょう。
さて、ここから本題ですが、ScrollViewのViewPortの子にContentがあります。ここに画像やボタンを配置するのですが、ここで使える便利な機能がGridLayOutGroupです。
GridLayoutGroup
contentにAdd Componentから
・GridLayoutGroup
・Content size Flitter
の2つを追加しましょう。GridLayoutGroupについてそれぞれの機能は公式にわかりやすくのってるので以下参照。
Grid Layout Group - UnityマニュアルContentSizeFlitterについては、GridLayoutGroupで指定した子の要素の大きさに合わせて、オブジェクトの大きさを調整するという便利なものです。この2つはセットで使われることが多いです。
簡単に上から見ていくと、
・Gridの左右25ピクセル、上下10ピクセルは間をあける。
・子のサイズは縦横共に210ピクセル。
・子の要素同士は縦横50ピクセルづつ間隔をあける。
・列数は3で固定する。(Consraint column count)
という感じです。また、ContentSizeFlitterのFitをPreferred Sizeにするのを忘れずに。これをしないと、Sizeがずれてしまう可能性があります。
ではどんな感じで並ぶのか見てみましょう。今回は最初のGifのようにボタンを並べてそのボタンに数字を表示してみます。
以下のコードをオブジェクトにアタッチして、
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Create : MonoBehaviour { public RectTransform contentRectTransform; public Button button; private void Start() { for(int i = 1; i <= 30; i++){ var obj = Instantiate(button,contentRectTransform); obj.GetComponentInChildren<Text>().text = i.ToString(); } } }contentRectTransformの部分にContentを、buttonの部分に作成したボタンをいれてあげれば、完了です!
自分でCellSizeやSpacingなどをいじって、間隔や要素の大きさなどを変更してみましょう!
以上です!!
- 投稿日:2019-02-15T13:42:07+09:00
Nuitrackでフェイス・トラッキング設定
Nuitrackの設定ファイルは私の環境だと以下にあります。
C:\Program Files\Nuitrack\nuitrack\nuitrack\data\nuitrack.configNuitrackのインストールディレクトリのパスは、
環境に応じて適時読み替えてください。オリジナルのファイルは残しておきたいので、
nuitrack.config
を複製してnuitrack_origin.config
とリネームしておきましょう。フェイスモジュールを有効にする
Faces.ToUse
とDepthProvider.Depth2ColorRegistration
をtrue
に設定します。
具体的にはnuitrack.config
の下記2箇所を変更します。"DepthProvider": { "Depth2ColorRegistration": true, }"Faces": { "ToUse": true }Unity環境の場合、
以下のサンプルプロジェクトからフェイストラッキングを試すことができます。
http://download.3divi.com/Nuitrack/doc/UnityFaceTracking_page.html取得できる顔情報を知りたい方は、以下のドキュメントを参考にしてください。
JSON形式で取得することができます。
http://download.3divi.com/Nuitrack/doc/Instance_based_API.html※現在の実装ではユーザーのスケルトンが検出させた後でないと顔の情報を取得できないようです。
- 投稿日:2019-02-15T13:42:07+09:00
Nuitrackでフェイストラッキング設定
Nuitrackの設定ファイルは私の環境だと以下にあります。
C:\Program Files\Nuitrack\nuitrack\nuitrack\data\nuitrack.configNuitrackのインストールディレクトリのパスは、
環境に応じて適時読み替えてください。オリジナルのファイルは残しておきたいので、
nuitrack.config
を複製してnuitrack_origin.config
とリネームしておきましょう。フェイスモジュールを有効にする
Faces.ToUse
とDepthProvider.Depth2ColorRegistration
をtrue
に設定します。
具体的にはnuitrack.config
の下記2箇所を変更します。"DepthProvider": { "Depth2ColorRegistration": true, }"Faces": { "ToUse": true }Unityの場合、
以下のサンプルプロジェクトからフェイストラッキングを試すことができます。
http://download.3divi.com/Nuitrack/doc/UnityFaceTracking_page.html取得できる顔情報を知りたい方は、以下のドキュメントを参考にしてください。
JSON形式で取得することができます。
http://download.3divi.com/Nuitrack/doc/Instance_based_API.html※現在の実装ではユーザーのスケルトンが検出させた後でないと顔の情報を取得できないようです。
- 投稿日:2019-02-15T13:02:54+09:00
AudioImporter で Force to mono は有効にしつつ、Normalize だけ無効にする
Force to mono
Unity側で音源をモノラルに変換して、容量を削減してくれる設定
モバイルだとONにしたい。インスペクタ上だと、この設定をONにすると、
Normalize
というオプション設定が選択できるようになる。
これは音量を平均化してくれる機能ですが、音素材側で音量調整されているケースもあって、
「小さい音にしたかったのにやたら音量上がってない?」みたいなことになります。なので、モノラル設定はONにしつつ、ノーマライズはOFFにしておきたい気持ちになりますね。
インポート設定を自動化したい
手動でやるのはつらくなるので、
AudioImporter をスクリプトからいじってなんとかしたい。が、AudioImpoter には、
forceToMono
というパラメータはありますが、
Normalize
に関するパラメータが公開されていませんでした。結果
以下のようにやってやると、該当のパラメータを取得して書き換えることができました。
AudioAssetPostProcessorvar audioImporter = assetImporter as AudioImporter; var serializedObject = new SerializedObject(audioImporter); var normalize = serializedObject.FindProperty("m_Normalize"); normalize.boolValue = false; serializedObject.ApplyModifiedProperties();参考
https://answers.unity.com/questions/1016473/how-to-disable-normalize-in-audioimporter.html
https://docs.unity3d.com/ScriptReference/EditorUtility.SetDirty.html
- 投稿日:2019-02-15T10:20:31+09:00
[Unity] 確率判定
RPGとかなんやらで「何%の確率で何かが起きる」みたいな時に使える関数があると便利だと思って書いておきます。
ソース
/// <summary> /// 確率判定 /// </summary> /// <param name="fPercent">確率 (0~100)</param> /// <returns>当選結果 [true]当選</returns> public static bool Probability(float fPercent) { float fProbabilityRate = UnityEngine.Random.value * 100.0f; if (fProbabilityRate < fPercent) { return true; } else { return false; } }使い方
if(Probability(30)) { //30%の確率で起こるイベント }他にも方法はいろいろあると思うけど、自分はこれが使い勝手良かった。