Unity3Dのヒントとコツ2







最初の部分の信じられないほどの成功の後(22人がそれを気に入っており、9件のコメントがあり、そのうち3件は私のコメントです)、著者(I)はUnity3dの世界でのエキサイティングな冒険の物語の続編を書くことにしました。



私はいくつかの新鮮なチップを拾おうとしました。



1.簡単なボタン



ヒントの意味(簡単に):エディターから任意のメソッドへの呼び出しを1行で追加できます。 エディターでオブジェクトを選択すると、メソッドの名前のボタンが表示され、クリックするとメソッドが実行されます。



ダウンロード、プロジェクトへのアップロード、コードの追加:



画像



エディターに表示されます:



画像



クリック後-実行結果:



画像



エフェクトをテストしたり、ゲームのロジックに応じて長時間待機する必要のあるイベントをすばやくトリガーしたりするのは非常に便利です。 時間を節約します。



コードはここからダウンロードできます



2.条件付き非表示



意味:不要なフィールドを簡単に隠すことができます。 たとえば、オブジェクトの場合、原点復帰を使用する場合にのみ、半径とTPパラメータを設定する必要があります。 それ以外の場合は、非表示(またはzadisable)にする必要があります。 とても簡単です。



画像



[Header("Auto Aim")] public bool EnableAutoAim = false; [ConditionalHide("EnableAutoAim", true)] public float Range = 0.0f; [ConditionalHide("EnableAutoAim", true)] public bool AimAtClosestTarget = true; [ConditionalHide("EnableAutoAim", true)] public DemoClass ExampleDataClass = new DemoClass(); [ConditionalHide("EnableAutoAim", true)] public AnimationCurve AimOffsetCurve = new AnimationCurve();
      
      





これで、EnableAutoAim条件が満たされた場合にのみフィールドが表示されます。 また、2つの条件を使用するだけでなく、非表示ではなく、単に不安定なフィールドを使用することもできます。



この男のおかげで、そこから属性のソースコードをダウンロードすることもできます。



このピースは非常に便利で、編集プロセスを簡素化します。



最初と2番目のヒントの動作が異なることに注意してください(最初のヒントはすべてのオブジェクトのCustomEditorと重なっており、場合によってはあまり良くありません。2番目はその属性のCustomPropertyDrawerです)。



3. 1つのボタンでさまざまな解像度のスクリーンショット



スクリーンショット用の標準のUnityツールはかなり退屈です-現在の解像度のスクリーンショットを撮るだけです。 しかし、ストーリーには、さまざまな解像度、さまざまなアスペクト比(16:9、4:3、それ以上)、さらに高い解像度の一部のiPadプロからのスクリーンショットが必要です。 新鮮な例-数週間前-それは必要でした:



3.5インチ(iPhone 4):640 x 960 px

4インチ(iPhone 5):640 x 1136 px

4.7インチ(iPhone 6):750 x 1334 px

5.5インチ(iPhone 6 Plus):1242 x 2208 px

iPad(9.7 + 7.9インチ):2048 x 1536 px

iPad Pro(12.9インチ):2732 x 2048


手元では、このようなデバイスの動物園は通常発生しません。 方法は簡単なスクリプトです。テクスチャを作成し、カメラをそこにレンダリングして保存します。



ここで取ることができます 。 そして、これは多くのカメラに変換する方法の例です。



これで、1つのボタンでスクリーンショットを作成できるようになりました。



4. LogErrorをパフォーマンスレポートに送信する



先史時代:ゲームでエラーが発生した場合、Parse.comサービスが使用されていました(例外ではなく、何か小さなもの-たとえば、武器のスプライトがないなど)、コードでDebug.LogError()が呼び出されました。 インターセプトされ、Parse.comに送信され、そこで多くのエラーがあった場合、データベースに入力されました。スクリプトはすぐにバグレポートを開始し、注意を払っています。 しかし、Facebookの⊂(°ʖ̯°)は解析を購入し、それを閉じて、多くの人々を破壊しました。 プログラムには、彼女に起こったトラブルに関する話を送る場所がありませんでした。



あらゆる種類のソリューションがあります(統計にそのようなものを送信し、他の何かを使用します)-しかし、自転車愛好家のために私はそのようなソリューションを提案します-パフォーマンスレポートに送信します(特に、これはプログラムのエラーを確認する最も論理的な場所であるため)。



そのため、Unityにはパフォーマンスレポートがありますが、例外のみがそこに届きます。 LogErrorミス。 LogErrorの代わりにExceptionを作成すると、はい、エラーが送信され、Performance Reportingに表示されますが、それ以上のスクリプトの実行は停止します。 そして、特に犯罪者はいない可能性があり、安全にそれを続けることができます。 例外を作成して自分でキャッチした場合、スクリプトは流出しません(キャッチします)が、パフォーマンスレポートには何も送信されず、それについてはわかりません。 私が提案する解決策は、LogErrorをフックすることです。エラーが受信された場合、別のクラスで例外をスロー(ロール)すると、エラーがPerformance Reportingに送信されます。 実際のコード:



コード
 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ErrorHandler : MonoBehaviour { public string output = ""; public string stack = ""; void Awake() { DontDestroyOnLoad(gameObject); } void OnEnable() { Application.logMessageReceived += HandleLog; } void OnDisable() { Application.logMessageReceived -= HandleLog; } void HandleLog(string logString, string stackTrace, LogType type) { if (type == LogType.Error) { output = logString; stack = stackTrace; Invoke("ThrowException", 0f); } } public void ThrowException() { throw new Exception(output + "\n" + stack); } }
      
      





はい、コードは理想とはほど遠いもので、パーの代替として作成されました。その責任に対処しているようです。 一連のエラーが理論的には正しく機能しない可能性があるという事実-私は理解していますが、実際にはこれはまだ起こっていません。



ブートシーンで、オブジェクトを作成し、このスクリプトをハングさせます。 彼自身がオブジェクトをマークして、シーンのロード時に削除されないようにし、デバッグにサブスクライブします。 LogErrorを受信すると、スクリプトは、UnityがPerformance Reportingに送信する例外をスローします。 彼についてどこで知りますか。



最後まで読んでくれた人に感謝します。 上記のいくつかが役に立つことを願っています。



All Articles