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

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

【Laravel】Migrationの実行とロールバック

PHPバージョン:7.1.14
Laravelバージョン:5.7.9

前回の続きです!
Migrationファイルは、作成するだけでは実行されません!
今回はMigrationの実行(migrate)を行い、
実際にデータベースにテーブルとカラムが出来ているのかを確認したいと思います!

続きを読む

【Laravel】Migration(マイグレーション)ファイル作成!DBテーブルとその履歴を作成します!

PHPバージョン:7.1.14
Laravelバージョン:5.7.9

本日はMigration(マイグレーション)についてです!
migration自体の意味は「移行」や「移転」などですが、
Laravel的にはデータベースの構築やバージョン管理を行う機能です!

コンソールから直接MySQLに入らなくても
テーブルを作成したりテーブルのカラム内容を変更したりできます!

また、どのタイミングでどのような変更を行ったか履歴が記録されます!
テーブルの状態を過去に巻き戻したりもできます!

続きを読む

【Laravel】データベース設定ファイル database.phpと.env

PHPバージョン:7.1.14
Laravelバージョン:5.7.9

今回はLaravelのデータベース設定ファイルについてです!
データベースはMySQLを使います!
こちらを参考にローカル環境(Mac)にインストールしました!
Mac へ MySQL を Homebrew でインストールする手順 - Qiita

続きを読む

【Laravel】ControllerからView(ビュー)を呼び出す!

PHPバージョン:7.1.14
Laravelバージョン:5.7.9

前回までで
特定のアドレスにアクセス→routeを参照→Controllerで処理を実行
というところまでできました!

今回はMVCのView(ビュー)を使い、
ブラウザにWebページを表示します!
(Unityなどゲーム開発ではほぼ使わないかと思いますので簡単に!)

続きを読む

【Laravel】Controller(コントローラー)を使ってテキストを表示する!

PHPバージョン:7.1.14
Laravelバージョン:5.7.9

今回はLaravelのController(コントローラー)という機能を使って文字列を表示します!
(前回のrouteに関する記事はこちらから。)
Controller機能を使う前に、MVCパターンについて簡単に触れておきましょう!

続きを読む

【Laravel】route(ルート)を設定してブラウザにテキストを表示する!

PHPバージョン:7.1.14
Laravelバージョン:5.7.9
本日はPHPフレームワークLaravelの2記事目です!
前回記事はこちら

今回はブラウザにテキストを表示するというめちゃくちゃ簡単な内容です!
それでは参りましょう!

続きを読む

【Laravel】プロジェクト作成/ローカルサーバー実行

PHPバージョン:7.1.14
Laravelバージョン:5.7.9

Unityの開発をしているとデータ保存などでサーバーを使いたくなります!
というわけで、PHPフレームワークLaravelを使って、
最後にUnityと連携していきます!

環境構築はこちらの、
バーチャル環境(VirtualBox+Vagrant)を導入しHomeSteadからLaravelを構築する記事を
参考にしました!

【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) - Qiita

続きを読む

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など)の情報も一緒に受け取れれば、バグフィックスの役に立ちますよね!

続きを読む