「 Unity3D 」一覧

【Unity3D】シリアライズでセーブデータを作成した時のメモ

普段どおりBinaryFormatterを使用してセーブデータを作ろうとした際のメモ。

BinaryFormatterに関してはこちらを参考にさせて頂きました。

○オブジェクトの内容をバイナリファイルに保存する: .NET Tips: C#, VB.NET, Visual Studio:
http://dobon.net/vb/dotnet/file/binaryformatter.html

そして今までUnity以外で組んでいた際に使用していた
下記のコードを使用して実行パスを取得。

    public static string GetAppPath()
    {
        return System.IO.Path.GetDirectoryName(
               System.Reflection.Assembly.GetExecutingAssembly().Location);
    }

これを用いて保存先を

string path = GetAppPath() + @”\savedata.sav”;

のように定義していました。

 

・・・しかし実行してみるとエラーは出ないものの何処に保存されているか分からないという事態に。

そこでGetAppPathの戻り値を調べてみると・・・何も返って来ていませんでした。
どうやらこの方法は使えないようです。

ちなみに保存先ですが、System.IO.Path.GetFullPathで調べると

> C:\savedata.sav

となっておりました。相対パスになるかと思いきや、ちょっと意外。

 

・・・で、現在は以下のようにしております。

    public static string GetAppPath()
    {
        return Application.dataPath;
    }

これは実行パスではなく、実行ファイルと同じディレクトリにあるデータフォルダ・・・?
のパスを持っているようです。

明確な事までは分かりませんが、今の所これで問題なさそうなんで
このまま進めて行くことにします・・・


【Unity3D】!IsActive () && !m_RunInEditMode

と、いうエラーが出てきたのでメモ。

ソースはこんな感じ。

using UnityEngine;
using System.Collections;

public class TestListener : MonoBehaviour {
        // (中略)
        void OnGUI () {
            // (中略)
            SendMessage("OnTest", hogehoge);
        }
}
using UnityEngine;
using System.Collections;

public class MyGUITexture : MonoBehaviour {
    // (中略)
    void OnTest(MyClass hoge) {
        // (中略)
        OtherMember.gameObject.active = false;
    }
}

かなり端折ってますが…

 

で、結論として

OnGUIUpdateにすれば良いようです。と言うか何故OnGUIに書いてたし。


【Unity3D】Instantiateを行った場合の初期化

普段はStartメソッドにて初期化を任せていたけれど、

var obj = (GameObject)Instantiate(以下略);
var cls = (MyClass)obj.GetComponent(typeof(MyClass));

のようにすると、clsを得た時点ではStartが実行されていないので

using UnityEngine;
using System.Collections;

public class MyClass : MonoBehaviour {

    private MyClass2 cls2;

    void Start() {
        this.MyClass2 = this.GetComponent(以下略);
    }

    void SetParam(int p) {
        this.cls2.hoge = p;
    }
}

MyClassの中身がこのような場合、

cls.SetParam を呼び出すとNullReferenceExceptionが出る!

という時のメモ。

 

・・・まあ対処法としては初期化に関してはStartではなく、Awakeに書けば良いだけでした。

全部のメソッドに初期化チェック+初期化の処理を挟んでたのが恥ずかしい限り。