非活性状態のGameObjectを活性状態にする

編集のために一部のGameObjectを非活性状態(active==false)にしておいて、起動時にすべて活性状態にしたい場合があったとします。

上の例では、Holeの子にHole1,Hole2,Hole3があり、Hole1とHole2は非活性状態です(Hole3を編集するために、不要なHole1,Hole2を非活性状態にしています)。
起動時にHole1,Hole2を活性状態にしたいのですが、GameObject.FindGameObjectWithTag()やGameObject.Find()だと非活性状態のGameObjectができず、SetActiveRecursively()がUnity4非奨励になって使えません。

そんなときは、活性状態にしたいGameObjectの親GameObjectのtransformから子を取得して活性状態にすることができます。

GameObject holeRootObj = GameObject.Find("Hole");
foreach( Transform child in holeRootObj.transform)
{
GameObject childGObj = child.gameObject;
childGObj.SetActive(true);
}

iPhoneやAndroidでGUI Textureがタップされたことを検知する方法

PCでGUI TextureがクリックされたときはOnMouseDown()を使えばよいのですが、iPhoneやAndroidだとそれに相当するイベントがないみたいです。なので、iPhoneやAndroidでGUI Textureがタップされたことを検知するためには自前でコードを書く必要があります。

ググると、Raycastを使う方法やiPhoneInputを使う方法など色々見つかりますが、うまく動かなかったり、Andoroidに対応できないという問題があったりしました。

最終的に、GUI TextureのComponentに以下のコードを追加することでうまく処理することが出来ました。

if (Input.touchCount == 1) {
Touch touch = Input.GetTouch (0);
if (touch.phase == TouchPhase.Ended) {
if (guiTexture.HitTest(touch.position, Camera.main)) {
//タップされた時の処理
}

このコードはタッチが終了したときにタップ処理を実行します。もしタッチの開始から終了までの間ずっと処理を実行したい場合は、
touch.phase == TouchPhase.Ended

touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Ended
に変えるとよいです。

また、このままだとGUI Texture外でタッチを開始し、GUI Texture内でタッチを終了した時もタップ処理が実行されます。自分のアプリだと別にそれでもよいので上記のコードで対応しましたが、もっとちゃんと処理する場合は、以下のサイトを参考にしてください。

Unity3D:GUI Textureでボタンを作成(2)

そういえば、iOS 7 Tech Talks に当選してた

iOS 7 Tech Talks に当選してたので、明日行ってきます!!
https://developer.apple.com/tech-talks/jp/

改めてメールを良く読むと、写真付きID(=免許証やパスポート)が必要らしいです。

あと、”あらゆる形式でのライブブログ活動は明示的に禁止”。
こちらも危うくイベントのレポートを書きまくるところでした。

事前に確認してよかったー。

Apple のイベントってどういう感じなのか、すごく楽しみ!!