「 Unity3D 」一覧

【Unity3D】DllNotFoundException: MonoPosixHelper

突然こんなエラーが出てきたのでメモ。

ちなみに書いていたのはこんなコード。

var ms = new System.IO.MemoryStream();
var ds = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Compress);

ネットワーク関係でbyte配列を圧縮したいが為にDeflateStreamを使用したいと思ったのですが

newした時点でエラー発生。インテリセンスとしては出てくるからてっきり使えるものと思っていたのに。

※なおDeflateStreamの代わりにGZipStreamを使用しても同じ結果となりました。

 

 

で、検索してみるとこういうページがヒット
http://answers.unity3d.com/questions/10620/dllnotfoundexception-monoposixhelpersystemiocompre.html

 

英語は苦手なので適当に翻訳かけて読んでみると

zlibがインストールされた環境でないと動かない感じ?

 

 

それは困るのでとりあえずDeflateStreamは使用しない方向で一応勧める事にしてみるのでした・・・

PluginフォルダにDLL放り込んで色々やれば出来るのかも知れませんが・・・

 

 

やはりMessagePackを使うのが良いのかしら・・・(´・ω・)


【Unity3D】error CS1010: Newline in constant

※ここの管理人はWindowsでUnityやってます。

	void Awake()
	{
        Debug.Log("単体");
	}

突然変なエラーが出だしたので色々やってみた結果、たったこれだけのコードでも出る事が判明。

んーこれはどうみても文字コード周り。ちなみにこの時の文字コードは UTF-8 のBOMなし (CR+LF)

 

ということで色々試してみた結果、

UTF-8 BOMあり (CR+LF)

に変更した所エラーが消えました。めでたしめでたし。

 

ちなみに何故今頃こんなエラーが出てきたかと言いますと、今までUTF-16(Unicode little endian)でコード書いていたのですが、GitHubでソースコードがバイナリ扱いになりdiff出来ないという状況になった為

「じゃあUTF-8でやってみようか。BOMは・・・とりあえず無しで」

という話が最近あった為です(‘`

 

 

文字コードいちいち変えるの面倒だからスクリプトのテンプレート触るか・・・と思ったけど

どうやらUnity4でもテンプレートの文字コード無視して強制的にSJISにしてしまう事が判明。ああめんどくさい(‘A` ヴァー


【メモ】OnCollisionEnterとTransform.parent

何か参考にしてもらえそうな簡単な物…という事でメダルプッシャーをささっと作ってみてる今日この頃。

しかしプッシャーの上に乗ったコインがプッシャーの動きに合わせて動いてくれないので以下のようなコードを書いてみた。

void Update () 
{
    // 落ちたコインを消す
    if (this.transform.position.y < -10) Destroy(this.gameObject);
}

void OnCollisionEnter(Collision c)
{
    if (this.transform.position.y < 6) // 2.3<Y<6の時、床に合わせて動いてもらう
    {
        if (this.transform.position.y < 2.3f)
        {
            this.transform.parent = null;
        }
        else
        {
            // parentに動く床をセット。this.ParentPusherは動く床(GameObject)
            this.transform.parent = this.ParentPusher.transform;
        }
    }
}

OnCollisionEnterを用いているのは、コインが投入されてからプッシャーの上に乗る前に
コインが床に合わせて動かないようにするため。

 

で、これを実行すると…遅い!

150枚くらいで一気に処理落ちを始めました。。

 

OnCollisionEnterがダメなんかなあという事で以下のコードを実行

void Update () 
{
    // 落ちたコインを消す
    if (this.transform.position.y < -10) Destroy(this.gameObject);
}

void OnCollisionEnter(Collision c)
{
}

実行結果…ほんの少し良くなった気がするが相変わらず遅い!

というか、これだけでも遅くなる事を知りませんでした。めらんは50の経験値を得た。

 

 

それはさておきOnCollisionEnterが使えないので、以下のように騙しを入れることに・・・

void Update()
{
    if (this.transform.position.y < 6)
    {
        if (this.transform.position.y < 2.3f)
        {
            if (this.transform.position.y < -10)
            {
                // 落ちたコインを消す
                Destroy(this.gameObject);
            }
            else
            {
                this.transform.parent = null;
            }
        }
        else
        {
            // parentに動く床をセット。this.ParentPusherは動く床(GameObject)
            this.transform.parent = this.ParentPusher.transform;
        }
    }
}

ちょっと書き方がアレかも知れませんが、なんのことはない、Updateに処理を移動しただけです。

空中でコインが移動してしまいますが、実際にやってみると意外と気にならなかったのでこれでよし。

 

 

で、実行結果・・・多少改善されたけど250枚くらいで一気に処理落ち・・・orz

 

 

 

・・・まあ思いつく事はやろうという事で以下のように修正して実行。

void Update()
{
    if (this.transform.position.y < 6)
    {
        if (this.transform.position.y < 2.3f)
        {
            if (this.transform.position.y < -10)
            {
                // 落ちたコインを消す
                Destroy(this.gameObject);
            }
            else
            {
                if (this.transform.parent != null) this.transform.parent = null;
            }
        }
        else
        {
            // parentに動く床をセット。this.ParentPusherは動く床(GameObject)
            if (this.transform.parent == null) this.transform.parent = this.ParentPusher.transform;
        }
    }
}

parentを設定する前に、ifで確認するようにしました。

 

で、実行結果・・・約650枚投入しても大丈夫!キタ━(゚∀゚)━!

※何故650かと言いますと、今の仕様上コインをガンガン投入しても溜まるのは650枚ほどになる為デス。

 

というわけで、

・OnCollisionEnterなどはやはり重い。メソッドを記述しただけで重い。

・Transform.parentに何かを代入するのは意外と時間を食う。

という結論。そんなメモでした。

 

なお、null以外の代入(↑の20行目)に結構な時間がかかるようですが、
nullを代入(↑の14行目)する時も少し時間がかかるようです。(nullが入ってる時にnullを入れる場合も同様)

 

それと余談ですがこれのコインは1枚につきBoxCollider1個しかついてません。
最初はCylinderに合わせて10個付けてたりしましたが…重い以前に滑りが悪い…
(2個しか接地しないようにしてもやはり滑りが悪かった)
やっぱり物量ある方がきっと楽しいですよね。ゲーセン行きたくなってきた・・・!