Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

Time.timeScaleに影響されないWaitForSecondsRealtime

コルーチンと一緒に、WaitForSecondsがよく使われます!
一定時間待機した後に処理を再開するメソッドです!
しかし実はWaitForSecondsで扱われる時間は、Time.timeScaleに影響され、
Time.timeScaleを0にすると永久に再開されません!
Time.timeScaleの影響を無視した現実時間分だけ待機したい場合は、
WaitForSecondsの代わりにWaitForSecondsRealtimeを使います!

WaitForSecondsRealtime

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

public class TestScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
        Time.timeScale = 0;
        StartCoroutine(WaitTime());
        StartCoroutine(WaitRealTime());
	}
	
    IEnumerator WaitTime() {
        yield return new WaitForSeconds(1f);
        Debug.Log("Finish WaitTime");
    }

    IEnumerator WaitRealTime() {
        yield return new WaitForSecondsRealtime(1f);
        Debug.Log("Finish WaitRealTime");
    }
}

結果
f:id:hiyotama:20180313121146p:plain

WaitForSecondsはTime.timeScaleを戻さない限り永久に待機し、
WaitForSecondsRealtimeのみ現実時間が使われていることが分かります!

以上です!

DestroyとDestroyImmediateの違い

gameObjectを破壊してHierarchy上から消し去りたい時に、よくDestroyメソッドが使われます!
が、Destroyで破壊されたgameObjectは実はまだ裏側で存在しています!(オブジェクトの数を確認すると分かります)
完全に消し去りたい場合には、Destroyの代わりにDestroyImmediateを使います!
(Immediate=即座)

DestroyとDestroyImmediateの違い

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

public class TestScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
        // 全子オブジェクトを取得
        var childArray = GetComponentsInChildren<Transform>().Where(t => gameObject != t.gameObject).ToArray();
        // 子オブジェクトの数を確認
        Debug.Log(childArray.Length);
        // 先頭の子オブジェクトをDestroyImmediate
        DestroyImmediate(childArray[0].gameObject);
        // 再度子オブジェクトの数を確認
        Debug.Log(GetComponentsInChildren<Transform>().Where(t => gameObject != t.gameObject).ToArray().Length);
        // 2番目の子オブジェクトをDestroy
        Destroy(childArray[1].gameObject);
        // 再度子オブジェクトの数を確認
        Debug.Log(GetComponentsInChildren<Transform>().Where(c => gameObject != c.gameObject).ToArray().Length);
    }
}

結果
f:id:hiyotama:20180313174632p:plain

DestroyImmediateでは子オブジェクトの数が減りましたが、
Destroyでは減りません!

ちなみに…

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

public class TestScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
        StartCoroutine(DestroyObject());
    }

    IEnumerator DestroyObject() {
        var childArray = GetComponentsInChildren<Transform>().Where(t => gameObject != t.gameObject).ToArray();
        Debug.Log(childArray.Length);
        DestroyImmediate(childArray[0].gameObject);
        Debug.Log(GetComponentsInChildren<Transform>().Where(t => gameObject != t.gameObject).ToArray().Length);
        Destroy(childArray[1].gameObject);
        // 1フレーム待機
        yield return null;
        Debug.Log(GetComponentsInChildren<Transform>().Where(c => gameObject != c.gameObject).ToArray().Length);
    }
}

結果
f:id:hiyotama:20180313175725p:plain

コルーチンで1フレーム待ってあげると、ちゃんと減っています!
1つの処理の中で即座にDestroyしたい場合にはDestroyImmediateをお試しください!

・・・と思ったのですが、公式では非推奨としているようです・・・
Object.DestroyImmediate
知識としてストックしておくにとどめておいたほうがよさそうです!

Coroutine内で処理の時間・順番管理を行う。

特別難しいことではないのですが、
コルーチン内で時間・順番を管理しながら処理を行う方法です!
yield return でコルーチンを呼び出せば、
コルーチンが終了するまでは先に進むことはありません!
コルーチン内でコルーチンを呼び出しても処理終了まで次の処理に移りません!

Coroutine内で処理の時間・順番管理を行う。

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

public class TestScript : MonoBehaviour {

	// Use this for initialization
	void Start () {
        StartCoroutine(Test1());
    }

    IEnumerator Test1() {
        Debug.Log("1st");
        yield return StartCoroutine(Test2());

        yield return new WaitForSeconds(1f);
        Debug.Log("3rd");
    }

    IEnumerator Test2() {
        yield return new WaitForSeconds(1f);
        Debug.Log("2nd");
    }

}

結果
f:id:hiyotama:20180313172402p:plain

【Unity】Unityで端末の情報(OS, 機種名, メモリサイズなど)を取得する!

今回は、現在アプリに使われている端末情報をUnity側で取得したいと思います!
例えばお問い合わせフォームをアプリ内に作る場合、
OS(iOS 10.2など)や、機種名(iPhone7Plusなど)の情報も一緒に受け取れれば、バグフィックスの役に立ちますよね!

続きを読む

【Unity】とりあえずPlayerキャラクターを作成【Photon3】

前回の続きです〜

Photonを使えば簡単にネットワークゲームが作成できるということで、とりあえず
①Playerの出現
②Playerの移動
③Playerの攻撃・死亡
などといったものを作成していきます!

というわけでまずはPlayerを作成します〜
(今回はネットワーク部分はやりません)

続きを読む