2016年8月31日水曜日

UnityのGetComponentとかFindとか

間違いや過不足などあればご指摘頂けると!

GetComponentに関して

gameObject.GetComponent<XXX>();した際、対象のクラスのコンポーネントが複数存在する場合は不定
複数取得する場合はGetComponentsを利用
gameObject.transformには.parentや.childCountなど親子関係の情報も保持

GetComponent (XXX)だと戻り値はComponent型となるためGetComponent(XXX) as XXXとすることでXXX型として返すことが可能
GetComponent<XXX>()であればジェネリクスを用いてXXX型で返すことが可能
該当するオブジェクトがない場合はnull

interfaceを指定したい場合はGetComponent(typeof(XXX)) as XXX

GetComponentsInChildren(XXX, true)で非アクティブもヒット
(GetComponentsInChildren<XXX>(true)も同様)

Find系に関して

Find("XXX")で名前でオブジェクトを検索することが可能
Find系は基本的にアクティブのみヒット

transform.Find("XXX")とすることで直下の子供だけを検索(孫以下は対象外)
非アクティブもヒット

FindObjectOfType(typeof(XXX))によってクラス名を指定して検索

名前で検索するのは重い処理
複数ヒットした場合は不定

非アクティブに関して

オブジェクトを非アクティブにする時はgameObject.SetActive(false)
スクリプトを非アクティブにする時はComponent.enabled = false

Unityのイベント関数

Unityで用意されてるイベント関数(StartとかUpdateとか)の一覧です。
覚書程度に。。。
勉強中ですので間違いや過不足などあればご指摘頂けると!

  • Reset : オブジェクトがアタッチされた時
  • Awake : インスタンス化直後(自身の初期化処理に留める)
  • OnEnable : アクティブ有効化
  • OnLevelWasLoaded : シーンが読み込まれた時
  • Start : インスタンス有効後、最初のフレームのUpdate直前(他オブジェクトも絡めた初期化処理)
  • FixedUpdate : フレームレートが低い場合はUpdateよりも頻繁に、高い場合はフレーム間に一度
  • Update : フレーム毎に呼出し
  • LateUpdate : Update直後に一度呼出し
  • OnPreCull : カメラがシーンを間引く前に呼出し
  • OnBecameVisible, OnBecameInvisible : カメラが表示 / 非表示になる度
  • OnWillRenderObject : オブジェクト表示時、カメラに対して一度
  • OnPreRender : カメラがシーンのレンダリングを開始する前
  • OnRenderObject : 全てのシーンレンダリング終了後
  • OnPostRender : カメラがシーンのレンダリングを終了した後
  • OnRenderImage : 画面レンダリング完了後、画面処理が可能になった際
  • OnGUI : GUIイベントに応じてフレーム毎に呼出し
  • OnDrawGizmos : Gizmosの描画に使用
  • OnDestroy : オブジェクト破棄直前のフレーム
  • OnApplicationQuit : アプリケーション終了前
  • OnDisable : 動作が無効になると呼出し

Unityで動的にAddComponent

動的にAddComponentしたい

gameObject.AddComponent<BoxCollider> ();

gameObjectとかBoxColliderは適宜置き換えて下さい(´・ω・`)

AddComponentしたコンポーネントを調整したい

BoxColliderのサイズを調整したいとかそういった場合は以下のように調整可能です。
BoxCollider collider = gameObject.AddComponent<BoxCollider> ();
collider.center = new Vector3 (0.0f, 0.0f, 0.0f);
collider.size = new Vector3 (1.0f, 1.0f, 1.0f);

centerは中心点からのオフセット値です!

2016年8月25日木曜日

MonoDevelop

MacのMonoDevelopさん、日本語入力が出来るようになったのは最近のお話。
日本語対応してくれたのは素直に嬉しい限りですし、文句言える立場ではないのですが、以下のような現象が発生しております(´・ω・`)

コメントとかで「昨日は」とか入れたい場合(あくまで例です)
キーボード的にはKINOUHAと入力すると思います。

KINOUと入力して「昨日」に変換して、HAと入力すると「あ」となるのです。。。
KINOU(in) -> 昨日(out) -> HA(input) -> あ(out)

以下のように入力すれば問題ないのですけどね。。。
KINOU(in) -> 昨日(out) -> Enter -> HA(input) -> は(out)

日本語変換を確定する次の入力(space, tab, deleteなどなどを除いて)をEnterとして処理しているのか、内部的なことは分かりませんが自分の癖のせいで非常に面倒なことになっております(´・ω・`)

同じ理由で嘆いている人は見かけなかったので少数意見かもしれません。
いや、日本語対応してくれただけで喜ばなきゃいけない!文句ばっか言ってちゃいけない!

あ、あと対応する括弧にジャンプする機能が欲しいのとファイルのタブ切替えをNext/Prevじゃなくて現実のタブ基準にして欲しいです(´・ω・`)

2016年8月19日金曜日

Unity x MagicaVoxel

無料で使える超有能ツールMagicaVoxel
使い方も簡単、Unityでのインポートも簡単と素晴らしいツールです。
デザイン系ツールが全然使えない自分でもゲーム感覚で簡単にボクセルが作れちゃいます。

詳しい使い方やインポート方法は他サイト様が詳しく書いてくださってますので割愛。
Unity内で座標を決定する際の基準点、Pivotについて。
MagicaVoxelではデフォルトで書き出すとX軸中央、Y軸下、Z軸中央にPivotが設定されております。
これを書きだした後にスクリプトから変更するのはこちらのサイト様を見る限り別の空オブジェクトを作って、その子供にしたり〜など厄介そうです。。。

ただ、MagicaVoxelはconfigをいじればPivotを自分で設定可能です!
普通にリリースノートに書いてあるんですが、誰かのお役に立てればと。。。

MagicaVoxel -> config -> config.txtfile_obj -> pivotの箇所をいじります。
pivot = '0 0 -1' // -1 : min, 0 : center, 1 : max
と記述があると思います。
X=0, Y=0, Z=-1です。
こちらMagicaVoxel上の軸ですのでお間違いなく!
MagicaVoxel上でオブジェクトを真上から見た際に右方向がX軸の正の方向、上方向がY軸の正の方向、真正面から見た際の上方向がZ軸の正の方向です。
なので以下のように変更すればオブジェクトの中央にPivotを設定できます!
pivot = '0 0 0' // -1 : min, 0 : center, 1 : max

2016年8月10日水曜日

UnityのMarkLightについて覚書 2

UnityのMarkLightについて覚書 2
MarkLight (AssetStore)
MarkLight Document (英語)

コード内でアニメーションを動的に生成したい時はここ(Creating Animations in Code)に記載があります。
以下、そのまま抜粋

var offsetAnimator = new ViewFieldAnimator();

// set up animation
offsetAnimator.EasingFunction = EasingFunctionType.QuadraticEaseOut;
offsetAnimator.Field = "Offset"; // the field that is to be animated
offsetAnimator.From = new ElementMargin();
offsetAnimator.To = new ElementMargin(x, y, 0, 0); // x and y set during runtime
offsetAnimator.Duration = 0.2f; // duration in seconds
offsetAnimator.TargetView = MyRegion; // the view whose Offset field is to be animated

// start animation
offsetAnimator.StartAnimation();

ただ、このままアニメーションしたいタイミングの箇所に記載しても動作しません。。。
TargetViewのUpdateに以下を記述する必要があります!

ViewFieldAnimator offsetAnimator;
void Update ()
{
    if(offsetAnimator != null && offsetAnimator.IsRunning)
        offsetAnimator.Update ();
}

当然、var offsetAnimator = 〜としていた箇所はメンバ変数を見るよう修正してください!