20190215のUnityに関する記事は7件です。

[Unity] 重力を変更する

1.ゲーム全体の重力を変更する方法

ゲーム全体の重力を変更するには、
Edit→Project Settings→Physicsを開いて、

スクリーンショット 2019-02-15 23.30.24.png

InspectorのPhysicsManagerのGravityのVector3の値を変更するだけです!
デフォルトではy軸に-9.81 m/s^2 の力がかかっていますね。地球と同じです。

スクリーンショット 2019-02-15 23.33.59.png

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-15 23.39.14.png

以上、重力を変更する方法でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GetComponentの基本を理解する

はじめに

1から勉強すると必ず出るメソッドです。写経を行いテキストの指示通りにやればほぼうまくいきます。しかしこれらを繰り返していくといざ説明する時に、何も理解をしていない事に気が付きました。テストを繰り返していくうちに理解できるようになったので、記事にします。

Componentとは

Inspectorに表示されているTransform以下の各々の情報。AddComponentでGameObjectで使うコンポーネントを追加します。GetComponentはこれらの情報を変数に割り当てることで、自由に設定できます。
component2.png

スクリプト

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オブジェクトにアタッチする。

結果

movie.gif

感想

今までコンポーネントの使い方は理解をほとんどしていなかったが、ロックマンのような足場を消す・現れるの繰り返しを作ってみたことで、理解が大分進んだと思う。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Unity] GridLayoutGroup入門 図鑑的なもの作成 ScrollView

今回はUnityのUIにおいて超便利な機能、GridLayOutGroupについて解説します。

今回はScrollViewにGridLayoutGroupを使って、

pazu-10441.jpg

よくゲームで見るこんな感じの図鑑のように、画像などを等間隔に表示することが簡単にできます!

イメージ↓
GridLayOut.gif

UnityでScrollViewを作る

CanvasScalerのUIScaleModeをScale with screen sizeにして、

スクリーンショット 2019-02-15 18.29.14.png

Create→UI→Scroll ViewからScroll Viewを作りましょう。
AnchorPresetsから右下のStretchを選び、RectTransformの全ての値を0にしてCanvasと同じ大きさにしましょう。
(Stretchは親オブジェクトから何ピクセル離れるか、というイメージです。今回は全て0にしているので親オブジェクトと同じ大きさですね)

スクリーンショット 2019-02-15 18.23.28.png

スクリーンショット 2019-02-15 18.30.31.png
これで画面いっぱいにScroll Viewが表示されました。

今回は縦方向の移動だけで良いとするので、Scroll RectのHozirontalのチェックを外して、Scrollbar horizontalのオブジェクトも削除しちゃいましょう。

さて、ここから本題ですが、ScrollViewのViewPortの子にContentがあります。ここに画像やボタンを配置するのですが、ここで使える便利な機能がGridLayOutGroupです。

GridLayoutGroup

contentにAdd Componentから
GridLayoutGroup
Content size Flitter
の2つを追加しましょう。

スクリーンショット 2019-02-15 18.42.09.png
最初はこんな感じ。

GridLayoutGroupについてそれぞれの機能は公式にわかりやすくのってるので以下参照。
Grid Layout Group - Unityマニュアル

ContentSizeFlitterについては、GridLayoutGroupで指定した子の要素の大きさに合わせて、オブジェクトの大きさを調整するという便利なものです。この2つはセットで使われることが多いです。

今回は以下のように数値を設定します。
スクリーンショット 2019-02-15 19.12.05.png

簡単に上から見ていくと、
・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の部分に作成したボタンをいれてあげれば、完了です!

GridLayOut.gif

自分でCellSizeやSpacingなどをいじって、間隔や要素の大きさなどを変更してみましょう!

以上です!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Nuitrackでフェイス・トラッキング設定

Nuitrackの設定ファイルは私の環境だと以下にあります。
C:\Program Files\Nuitrack\nuitrack\nuitrack\data\nuitrack.config

Nuitrackのインストールディレクトリのパスは、
環境に応じて適時読み替えてください。

オリジナルのファイルは残しておきたいので、
nuitrack.configを複製してnuitrack_origin.configとリネームしておきましょう。

フェイスモジュールを有効にする

Faces.ToUseDepthProvider.Depth2ColorRegistrationtrueに設定します。
具体的には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

※現在の実装ではユーザーのスケルトンが検出させた後でないと顔の情報を取得できないようです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Nuitrackでフェイストラッキング設定

Nuitrackの設定ファイルは私の環境だと以下にあります。
C:\Program Files\Nuitrack\nuitrack\nuitrack\data\nuitrack.config

Nuitrackのインストールディレクトリのパスは、
環境に応じて適時読み替えてください。

オリジナルのファイルは残しておきたいので、
nuitrack.configを複製してnuitrack_origin.configとリネームしておきましょう。

フェイスモジュールを有効にする

Faces.ToUseDepthProvider.Depth2ColorRegistrationtrueに設定します。
具体的には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

※現在の実装ではユーザーのスケルトンが検出させた後でないと顔の情報を取得できないようです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AudioImporter で Force to mono は有効にしつつ、Normalize だけ無効にする

Force to mono

Unity側で音源をモノラルに変換して、容量を削減してくれる設定
モバイルだとONにしたい。

インスペクタ上だと、この設定をONにすると、 Normalize というオプション設定が選択できるようになる。
これは音量を平均化してくれる機能ですが、音素材側で音量調整されているケースもあって、
「小さい音にしたかったのにやたら音量上がってない?」みたいなことになります。

なので、モノラル設定はONにしつつ、ノーマライズはOFFにしておきたい気持ちになりますね。

インポート設定を自動化したい

手動でやるのはつらくなるので、
AudioImporter をスクリプトからいじってなんとかしたい。

が、AudioImpoter には、 forceToMono というパラメータはありますが、
Normalize に関するパラメータが公開されていませんでした。

結果

以下のようにやってやると、該当のパラメータを取得して書き換えることができました。

AudioAssetPostProcessor
var 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[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%の確率で起こるイベント
}

他にも方法はいろいろあると思うけど、自分はこれが使い勝手良かった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む