Unity3Dについて知らないこと

カートは何ですか?



機能、およびこのエンジンの開発中に存在する機能の一部について説明したいと思います。 私はUnity3Dで約3年間働いてきたので、このような平凡な記事については十分な考えが蓄積されました。 いくつかの場所では私はあまりにも賢く、あなたにとって有益ではないかもしれないことについて話しますが、ほとんどの場合、物語は非常にシンプルで頻繁に使用されるものについてです(もちろんそれらについて知っている場合)。



デバッグ用のエディターモード。



コンポーネントのプライベートフィールドがあり、その値を確認する必要がある瞬間を知っていますか? 以前は、常にその値をログに出力するか、必要な属性ですばやくマークするか、まったく公開していました。 しかし、もっとクールな方法があります。



画像



実証するために、単純なコンポーネントを作成しました。



using UnityEngine; using System.Collections; public class PrivateFieldTest : MonoBehaviour { private int Score; }
      
      







スクリーンショットでわかるように、プライベートはすべて暗い色で表示されます。 インターフェイスも大幅に変更されており、このモードは操作に適しておらず、非常に便利ではありませんが、デバッグには適しています。 もちろん、サードパーティのデバッガーを接続する場合、これはほとんど役に立ちませんが、この機能は便利です。 また、私の知る限り、このモードでは、すべての種類のコンポーネントカスタマイザが機能しません。 デバッグモードのビルド設定のあるウィンドウが次のようになっているとしましょう。



画像



スタート、それはtrapだ



startメソッドはcorutinのように機能します。 更新では、馬でそのような動きに乗らないとしましょう。



 using UnityEngine; using System.Collections; public class StartIsCorutineTest : MonoBehaviour { IEnumerator Start () { print("I'm wait 5 second!"); yield return new WaitForSeconds(5); print("I'm done!"); } }
      
      







これは、開始時に何らかの遅延が発生する可能性がある場合に十分役立ちます。 もちろん、コルチンを最初から直接呼び出すことができますが、より簡潔に同意します。



SendMessage。 またはあなたが気分が良くなるもの。



多くの人が既にこの機能について知っているので、この機能の説明を追加する価値があるかどうか長い間考えていましたが、このことを発見した同僚が何人かいました。 事はそれです。 コンポーネントがあり、緊急に別のコンポーネントに何か重要なことを伝える必要があるとします。 通常のアプローチは何ですか:



 gameObject.GetComponent<Health>().TakeDamage(60);
      
      







非常にエキサイティングな、わずかに大規模な構文(ただし、新しい規範によるとC ++が見られました) しかし、主な問題は、リンクを取得するコンポーネントのタイプを知る必要があるという事実にあります。 SendMessageはこのニュアンスを取り除くのに役立ち、メソッド名と引数を知るだけで済みます。



 gameObject.SendMessage("TakeDamage", 60);
      
      







もちろん、問題は、呼び出されたメソッドが返すべきものを返さないことです。 しかし、トラップの計画を作成して、ちなみに小さなJSを取得することはできますが、実際にはJSではありません。 コールバック引数に、返す値を受け入れる関数を渡すと仮定します。 スタイリッシュでファッショナブルで若々しく、現代の寛容な社会で非難されるべきではありません。 また、同じ名前のメソッドを持つコンポーネントの重量が重くなると、問題が発生する場合があります。



画像



オブジェクトスケールがメッシュバッチ処理を中断する



最近、このトピックに関する質問が頻繁になっています。 一部これはそうです、上の写真は完全に行っていただろう。 壊れる可能性は高いですが、壊れない可能性があります。 多くの要因がありますが、 オフヘルプを使用します



-ダイナミックバッチ処理の場合、原則として、オブジェクトのスケールは同じである必要があります。例外は、すべてのオブジェクトが均等にスケーリングされていない場合、それらが互いに結合できることです。



これはどういう意味ですか、私自身は完全に理解していませんでした。 バッチ処理が中断すると、これによりDraw Callが増加しますが、これは非常に悪いことです。



画像



選択したオブジェクトはインスペクターで修正できます



シーンに多くのオブジェクトがあり、オブジェクトの1つに既にあるコンポーネントのいずれかへのリンクを配置する必要がある場合に便利です。 原則として、コンポーネントを持つオブジェクトを選択し、階層からオブジェクトをドラッグするだけで十分です。 ただし、両方のオブジェクトが(階層内で)互いに十分に離れていると、神経質なチックが発生する可能性があるため、問題が発生する可能性があります。 しかし、インスペクターが特定のオブジェクトを修正する小さなロックがあります。



画像



また、インスペクターで多くのタブを開き、目的のオブジェクトに目的のタブを固定することもできます。



WWWメモリリーク。



WWWクラスには非常に深刻な問題があり、多くのテクスチャをロードする必要があるときにそれが感じられます。 ヘルプの例では、次のコードを示しています。

  IEnumerator Start() { WWW www = new WWW(url); yield return www; renderer.material.mainTexture = www.texture; }
      
      





問題は、フィールドを介してテクスチャを受け取ると、毎回新しいテクスチャが作成され、メモリからアンロードされたくないことです。

その結果、これを取り除くことができるコードを適用しました:

 //    . public override void OnWWWFinish(WWW www) { Texture2D tex = new Texture2D(4, 4, TextureFormat.RGB24, false, false); www.LoadImageIntoTexture(tex); tex.Compress(false); www.Dispose(); }
      
      







別れの言葉



一度に、私は多くを思い出すことができませんでしたが、さらに少ない説明します。 しかし、私は本当に面白いことを、たいていはもちろん編集者によって説明したいと思います。 彼はささいなことで正しいことをしましたか? 知りません 私はそれを好きになるでしょう、私はそれをもう一度書きます、私はそれを好きではないでしょう、とにかくそれを書きます。



All Articles