「 Unity 」一覧

【Unity3D】【VS2010】IDEを2つ立ち上げてコピペでソース管理する時のメモ1

そもそも何故2つ立ち上げているかと言うと、

 

片方はゲーム本体(Unity)で、もう片方はアプリケーションサーバーな訳です。

 

で、この時に共通の情報(パケット処理周り)を持たせてる共通クラスファイルが1個だけあるんですが・・・

何が面倒かと言えば、

 

Unityのコンソール出力は「Debug.Log」に対して

鯖側が普通にWindowsフォームなので「Console.WriteLine」であること。

なので共通クラスファイルにこういうコードを書いて・・・

    namespace UnityEngine
    {
        public class Debug
        {
            public static void Log(string s)
            {
                Console.WriteLine(s);
            }

            public static void LogWarning(string s)
            {
                Console.WriteLine(s);
            }
        }
    }

コンソール出力はDebug.Logで統一。

ソースを変更して、鯖からUnityにコピペした時はこれをコメントアウト
Unityから鯖にコピペした場合はコメントアウトを外す・・・とやってましたがちょっと面倒くさい(‘A`

 

#if で何とかならんかなあ・・・と思ってた結果

 

1. 鯖側のプロジェクトのプロパティ > ビルド > 条件付きコンパイルシンボルに任意の文字列を追加

kk001

※セミコロン区切りで複数定義可能。

2. ソースをこのように書き換える

#if IsM2Server
    namespace UnityEngine
    {
        public class Debug
        {
            public static void Log(string s)
            {
                Console.WriteLine(s);
            }

            public static void LogWarning(string s)
            {
                Console.WriteLine(s);
            }
        }
    }
#endif

これで無事にUnity側にコピペしてもこのDebug.Logモドキはコンパイルされないことに。

シンボルの定義を今更知った次第でありました(汗

 

そもそもこれ以外にも方法あるよ!とか管理の仕方からおかしい!

とかいう話だったら申し訳無い(‘A`


【Unity3D】XMLSerializerでシリアライズ→デシリアライズした時に特定の型(List<int[]>)がnullに

正確には以下の環境で発生。

シリアライズ: .Net Framework 4.0
↓(TCPで送信)
デシリアライズ: Unity 4.1.2 f1

 

・・・そもそもそこでXMLSerializer使うのはどうなのという点は置いといて。。

 

とりあえず結論としては、monoのバグか何かのようで・・・

 

まず、.Net Framework4でシリアライズしたクラスの出力がこちら。

<?xml version="1.0"?>
<MyPacket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PacketType>N_Debug2MatchingInfo</PacketType>
  <Data xsi:type="N_Debug2MatchingInfo">
    <MatchineKeyNumber>1</MatchineKeyNumber>
    <IsHost>false</IsHost>
    <UnitPartes>
      <ArrayOfInt>
        <int>0</int>
        <int>0</int>
        <int>0</int>
(以下略)

続いてUnityで同じクラスをシリアライズしたクラスの出力がこちら

<?xml version="1.0" encoding="shift_jis"?>
<MyPacket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PacketType>N_Debug2MatchingInfo</PacketType>
  <Data xsi:type="N_Debug2MatchingInfo">
    <MatchineKeyNumber>1</MatchineKeyNumber>
    <IsHost>false</IsHost>
    <UnitPartes>
      <ArrayOfInt1>
        <int>0</int>
        <int>0</int>
        <int>0</int>
(以下略)

違いはencoding指定がついてるのと・・・ArrayOfInt1?なにこれ?

 

なおこの「ArrayOfInt」となるUnitPartesという変数の型は、List<int[]>です。

List<bool[]>とかList<byte[]>も同じようになるのかなあ・・・

 

まあ他の方法で代用すれば良いので、早速修正するか。。

余談ですが、int[ , ] も「2Dimensionはサポートされていません」みたいなこと言われてシリアライズ出来ないのでご注意。


【メモ】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個しか接地しないようにしてもやはり滑りが悪かった)
やっぱり物量ある方がきっと楽しいですよね。ゲーセン行きたくなってきた・・・!