触れるUIと触れないUI

3D上のタッチと、uGUI上の演出がかぶったときに3D上のタッチが効かなくなるケースがある。
サンプルだとキューブとテキストの部分)
そんな時はCanvas上のGraphic RaycaterをオフにすればOK。
別でボタンなどのパーツが必要なときは別途Canvasを作ってそっちのGraphic RaycasterをONにしておけばタッチが効くパーツとタッチの必要のないパーツがCanvasで分けられる。

>>サンプルプロジェクトダウンロード

VideoEventのバッティング

動画の拡縮の際に通常のflv埋め込みだとジャギーが目立った。
どうやらFLVPlaybackを使うことでアンチエイリアスを使えるようになるみたい。
fl.video.VideoPlayer#smoothing

小さなプロジェクトだったのでタイムラインにコードを直書きしていたら

シーン 1, レイヤー ‘レイヤー 2′, フレーム 1、行 18、列 46 1119: 未定義である可能性が高いプロパティ COMPLETE に静的型 Class の参照を使用してアクセスしています。

こんな感じのエラーがでた。

どうも
flash.events.VideoEvent

fl.video.VideoEvent
がバッティングしているためだった。
タイムラインにスクリプトを書くと自動でflash.以下すべて(?)のパッケージが自動でインポートされるためそちらが優先されていたみたい。
なので、fl.video.VideoEvent.COMPLETEとフルのネームスペースを書いて解決できた。

64bit(arm64)対応の際の動的メソッドの呼び出し

64bit化に対応する際にちょっとハマったので調べてみたら、動的にメソッドを呼ぶ際の呼び出し方に対応が必要そうだった。
もともとのソースは。

Method method = class_getInstanceMethod([self->object class], self->selector);
IMP callback = method_getImplementation(method);
callback(self->object, self->selector, [[NSNumber alloc] initWithInt:1]);

もしくは

objc_msgSend(self->object, self->selector, [[NSNumber alloc] initWithInt:1])

こんなコードはパラメータで渡したオブジェクトがうまく渡らずEXEC_BAD_ACCESSで落ちてしまった。
それを

((void(*)(id, SEL, id))objc_msgSend)(self->object, self->success, [[NSNumber alloc] initWithInt:1]);

このように変えたらうまく動いた。

あと、「Implicitly declaring library function ‘objc_msgSend’ with type ‘id (id, SEL, …)’」というワーニングが出てたけど
#import <objc/runtime.h>
としているところを
#import <objc/message.h>
と変えたらワーニングも消えた。

参考)
Over&Out その後 | 【iOS7】AsyncImageView が arm64 でクラッシュする件Add Star

Landscapeでの起動画面の設定

横モードのみでiPhoneアプリを作るときにどうしてもiPhone5/6での起動画面が設定できなかったので調べてみた。
iPhone(iPhone6+以外)ではアプリが横でも起動画面は縦で用意する。
だけど、Asset Catalog(Images.xcassets)を使って起動画面を用意するとなぜか起動しても真っ黒。
どうしたらいいかと思って、xcassetsを使わずに以前のような命名規則に乗っ取った方法で設定したらうまくいった。

150410_default_setting

XCode6.3でまっさらなプロジェクトを作って試してもやはり真っ黒になるので、これはバグですよね…??
なので、横のみのアプリの際には起動画面はAsset Catalogを使わずに命名規則に沿った起動画面の画像を入れるのがよさそう。

UnityEventについて

Unity4.6からuGUIが追加された際に、UnityEventというイベントシステムも追加されました。
uGUIと同時に追加されたので、uGUIで扱うイベントシステム系かと思ってしまいますがあらゆる場面で利用ができます。
以前、イベントについてどのようなやり方がいいか試してみたんですが、その際に作ったものにUnityEventでのやり方を追加してみました。

>>サンプルプロジェクトダウンロード

Continue…

UnityゲームUI実践ガイド 開発者が知っておきたいGUI構築の新スタンダード

Unity4.6/5で追加された新たなuGUIの解説本
UnityゲームUI実践ガイド 開発者が知っておきたいGUI構築の新スタンダード
が発売されました。
いままではNGUIがスタンダードでしたが、これからはUnity標準のuGUIですべて実現できるレベルのものになっているようです。
RépubliqueシリーズのUIなどを担当されていた池和田さんが書かれているので実践的な内容になっていそうですね。
本にするかKindleにするか迷いますが僕もそろそろuGUIを勉強しようとおもいます。

インスペクタでのAnimationCurveの利用

インスペクタ上でAnimationCurveを使ったデータの利用。
グラフをいじって、Evaluate(float time)にて、timeに対する値が取得できる。

using UnityEngine;
using System.Collections;

/// <summary>
/// AnimationCurveのテスト。
/// </summary>
public class CurveTest : MonoBehaviour {
	/// <summary>
	/// AnimationCurve.
	/// </summary>
	[SerializeField]
	AnimationCurve curve;

	/// <summary>
	/// 経過時間。
	/// </summary>
	float passedTime = 0f;

	/// <summary>
	/// Update.
	/// </summary>
	void Update () {
		passedTime += Time.deltaTime;
		int sec = (int)passedTime;
		float per = passedTime - sec;

		Vector3 pos = this.transform.position;
		pos.x = this.curve.Evaluate(per);
		this.transform.position = pos;
	}
}

AppDelegateから現在アクティブなUIViewController

Storyboardを使っていて、現在のアクティブなUIViewControllerを調べる方法。

[self.window.rootViewController presentedViewController];

NSLocalNotificationなどから起動した際の処理を分けたりする場合に便利。

参考)てっくろぐ | Storyboardを使っているときにAppDelegateからアクティブなUIViewControllerを取得する

ちなみに
AppDelegateを取得する方法は

AppDelegate *delegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

参考)CreativeStyle | AppDelegateの参照をカンタンに取得する方法

2DでのLookAt

2Dでの制作の際にLookAt()を使ったらオブジェクトが見えなくなった。
よく考えたら3D空間でLookAt()されるので奥行きの方に倒れてしまって見えなくなっていたようだった。
LookAt()を使わずQuaternion.FromToRotation()を使ったら向くようになりました。

	public override void Update() {
		Vector3 diff = (this.targetGO.transform.position - this.transform.position).normalized;
		this.transform.rotation = Quaternion.FromToRotation(Vector3.up, diff);
	}

参考)
テラシュールブログ | UnityのベクトルとQuaternionによる回転について