2016-04-06 9 views
0

現在、Unity 3Dで開発中のビデオゲームプロジェクトで、私の友人と仕事をしています。 ゲームには特定のスポーンポイントが関与し、実際にはオブジェクトを決定された速度で発射物として発射します。それらのスピードは、このスポーンポイントに関連するスクリプト(JavaScript)でコード化されたパブリック変数によって管理されます。 スポーンされたオブジェクトは、世界でスローされる前に速度を検索し、ゲーム中に変化する可能性のある決定された速度で移動します(これは人間のプレーヤーの仕事に関連する主要な機能の1つですゲーム)。発射速度変数の計算コストを下げる方法は?

我々は現在、発射体が移動しなければならない速度見つけるために、このメソッドを使用している:今

var script: spawn = findObjectOfType(spawn); 
myspeed = script.speed; 

を、すべてのアップデートでこれを行うことで、更新キックとして、計算コストの面で非常に痛みを伴う可能性があり毎秒何千回も。この操作を実行するためのよりよい方法を達成する機会はありますか?

私は十分に明確になっているかどうか分かりませんが、他に何かが必要な場合はお知らせください。

+0

変数を読むことは、JITが最適化するのに安く簡単です。あなたのゲームをベンチマークし、時間を費やす前にこれが本当に問題であることを確認してください。 – ssube

答えて

1

クイックノート:、私は私の統一作業のためのC#を使用するので、コードは多少異なる場合がありますが、それでも概念適用する。

FindObjectOfType、GetComponentなどは、パフォーマンスが低下するため、Update内のすべてのコストをかけて回避する必要があります。オブジェクトがどのようにインスタンス化されるかに応じて試すことができる多くの選択肢があります。あなたがあなたの質問で言わなかったので、私はいくつかカバーします。 「生まれた」のゲームオブジェクトはこの場合、エディタ
シーンにすでにある場合

、あなたは単にスポーンポイントスクリプトの種類の生み出したオブジェクトのスクリプトにプロパティを追加することができます。すると、エディタで、あなたは多数のオブジェクトをインスタンス化している場合、これは実際には良いアイデアではありませんランタイム
でプレハブをインスタンス化するインスタンス化を使用している場合は、そのオブジェクト

上にスポーンポイントをドラッグします。オブジェクトのインスタンス化は非常に高価な操作です。可能であれば、インスタンス化されたオブジェクトを保存して再利用するだけです。いずれにしても、これがあなたのアプローチである場合、インスタンス化されたプレハブでGetComponentを使用して、生成されたオブジェクトのスクリプトへの参照を取得し、そこから必要な値を設定することができます。すべてのこのスクリプトナンセンスの代替だけスポーンに取り付けられたパーティクル・システムを使用することでパーティクルシステム
:これはまだ更新にGetComponentを使用することを含むが、それは依然としてFindObjectOfType

完全に異なるアプローチを使用するよりも幾分良好ですポイント。パーティクルシステムは、非常に迅速かつ効率的に多数のオブジェクトを作成するように設計されています。
あなたはアップデート「は、毎秒何千回も」起こることをあなたの質問で述べている:一度パーティクルシステムを作成し、あなただけのエディタ

役立つかもしれないいくつかの他のノートに開始速度を設定することができます。更新はすべてのフレームで実行されます。これは、アップデートの間隔がコンピュータからコンピュータまで、そして瞬時に変化する可能性があることを意味します。これは、Updateで書かれたコードがデフォルトでフレームレートに依存することを意味します。ゲームプレイの目的でこれらのオブジェクトを生成する場合、そのスポーンレートがフレームレートに依存しないことを確認する必要があります。 Time.DeltaTimeを使用して、最後の更新以降の秒数を取得できます。たとえば、(C#については申し訳ありませんが、簡単に翻訳できるはずです):

public float TimeBetweenActions = 1f; 
private float elapsed = 0f; 

void Update() { 
    elapsed += Time.DeltaTime; 
    if(elapsed >= TimeBetweenActions){ 
     DoTheThing(); 
     elapsed-=TimeBetweenActions; 
} 
0

「スクリプト」の参照をStartメソッドに保存する必要があります。

これで、更新プログラムで作業します。また、 'スポーン'のタグを設定し、 'gameObject.FindGameObjectWithTag(文字列タグ);'

最後の事:あなたは...スピードについては本当に心配している場合だけではJavaScriptを使用していない

+0

タグを設定してfindgameobjectwithtagを使用するのは「良い」わけではありません。どのFindメソッドも遅いです。 最後のもの。 JavaScriptを使用するかどうかは関係ありません。それはすべてMonoBehaviourに変換されます。 Unity3dでJavaScriptを使用すると 'スピードが妥協しない ' – Aizen

関連する問題