C#」タグアーカイブ

Debug.LogFormat

Debug出力する際に、定例分の中に変数を埋め込むString.formatは便利なのですが、Debug.Logと組み合わせると、コードが長くなってしまいますが、直接、フォーマットできる方法があります。

Debug.LogFormatを使うと、整形フォーマットを指定できます。

string foo = "abc";
Debug.LogFormat("foo: {0}", foo); // foo: abc

引数の指定の仕方は、String.formatと同じ。

C#で2次元配列

C#で2次元配列を宣言、初期化する

int[,] twoDim = new int[8,16];

要素8個の中に、要素16個を持つ2次元配列をつくる。

2次元配列のアクセス

int[2,4] = 128;

左クリックなのか、右クリックなのかを判別する方法

イベントデータからボタンの種別を取得できる

例えば、

public void OnPointerClick(PointerEventData pointerEventData)
{
    switch(pointerEventData.pointerId)
    {
        case -1:
            Debug.Log("Left Click");
            break;
        case -2:
            Debug.Log("Right Click");
            break;
        case -3:
            Debug.Log("Middle Click");
            break;
    }
}

https://docs.unity3d.com/ja/current/ScriptReference/EventSystems.PointerEventData.html

UIのPrefabを追加するときのWarning

Prefab化したUIパーツをCanvasに、スクリプトでアタッチしようとしたらWarningが出た。

Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.
UnityEngine.Transform:set_parent(Transform)

GameObject o = Instantiate( Foo );
o.transform.parent = this.transform;

こういう様に親GameObjectを指定するのは良くはなく、以下が正しい。

GameObject o = Instantiate( Foo );
o.transform.SetParent(this.transform);

Via! http://haraken.hatenablog.com/entry/2016/11/11/RectTransform%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%A8%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E8%A9%B1

ofMapみたいなMapping&Scaling

ofMapのように、任意の数値を定められた数値範囲変換(スケーリング、数学的には線形写像というらしい)をC#でできるようにする。
独自のユーティリティクラスを作る方法もあるが、既存のfloat型を拡張する形での実装方法。

以下のコードを、Map.csなどとして、スクリプトを置くフォルダ(ex. /Scripts)に保存する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class ExtensionMethods
{
    public static float Map (this float value, float fromSource, float toSource, float fromTarget, float toTarget)
    {
        return (value - fromSource) / (toSource - fromSource) * (toTarget - fromTarget) + fromTarget;
    }

}

使用方法は以下の通り

float foo = 0.5f;
float result = foo.Map( 0.0f, 1.0f, 0, 100 );
//50

Via! https://stackoverflow.com/questions/14353485/how-do-i-map-numbers-in-c-sharp-like-with-map-in-arduino

UniRxでTimer処理を行う方法

UniRxでTimer処理を行う方法

	Observable.Interval(TimeSpan.FromMilliseconds(1000)).Subscribe(l =>
        {
		//Something Do            
        }).AddTo(this);		

TimeSpan.FromMilliseconds(1000)で、ミリ秒で待ち時間を設定する。