こんにちは 非常に長い間、資料の準備は私のために広がっていました(人生はお尻に多くのキックを与えました)が、私はそれをやったし、最初の記事の続きをあなたと共有する準備ができています。
パート1物理テストに失敗しましたこのパートでは:
-前の記事のコードを最適化します。
-オブジェクト「ベース」を作成し、時々修復することを教えます。
-銃を追加し、銃をリロードします。
-「不便な」変数gvを取り除きます。
そして、記事の終わりに小さなボーナスがあなたを待っています:)
誰もが興味を持っている-待望の猫へようこそ!
最適化、バグ修正、ステージ上の再配置、その他すべて
チュートリアルのこの部分では、以前に記述した
たわごとコードを最適化します。これにより、ゲームのパフォーマンスのマージンが得られます。
まず、銃のAIスクリプト、距離の計算方法に影響を与えた変更、カートリッジのあるカートリッジの出現、指定された時間続くリロードから始めます。
PlasmaTurretAI.csusing UnityEngine; public class PlasmaTurretAI : MonoBehaviour { public GameObject curTarget; public float towerPrice = 100.0f; public float attackMaximumDistance = 50.0f;
どうやら、ここで計算は距離の2乗と銃の最大距離の2乗との比較を通して使用されます。 より速く動作します Sqrtは使用されません。
ヒントをくれた
レオポタムに感謝します:)
次のステップは、シーンを次の形式にすることです。
赤い点で赤い点をマークしました。中央には標準のマックスティーポットの形の「ベース」があります:)
Baseタグをベースに配置して、簡単に見つけられるようにします。
銃を無視してMobをベースに直行させる必要があります。 これを行うには、特定の間隔で損傷と修理を理解するようにベースに教える必要があります。
さあ、始めましょう:
Basehp.cs using UnityEngine; public class BaseHP : MonoBehaviour { public float maxHP = 1000; public float curHP = 1000; public float regenerationDelayConstant = 2.5f;
ベースを使用してオブジェクトにスクリプトを掛けます。 彼女は準備ができています、あなたはモブの再訓練を開始できます!
AIモブスクリプトでは、Updateメソッドのみが変更される可能性があるため、残りのコードは提供しません。
MobAI.cs private void Update() { if (Target != null) { mob.rotation = Quaternion.Lerp(mob.rotation, Quaternion.LookRotation(new Vector3(Target.transform.position.x, 0.0f, Target.transform.position.z) - new Vector3(mob.position.x, 0.0f, mob.position.z)), mobRotationSpeed); mob.position += mob.forward * MobCurrentSpeed * Time.deltaTime; float squaredDistance = (Target.transform.position - mob.position).sqrMagnitude;
すべてが順調で、mobはクロールしてベースを噛み、銃は巧妙に撃ちます。 しかし、カメラは静的です! 障害、修正:
CameraControl.cs using UnityEngine; public class CameraControl : MonoBehaviour { public float CameraSpeed = 100.0f;
もちろん、スクリプトはカメラにかかっています。 これですべてが動いているので、ベースに近づいているMobを見て回り、銃を途中に置くことができます。
次のバグ修正は、「クレジットで」銃を購入できることです。 はい、プレイヤーのお金と銃のコストを簡単に確認する必要があります。 この問題を修正します。
Graphic.cs private void OnGUI() { GUI.Box(buyMenu, "Buying menu");
さらに、以前のすべてのコードを記述した後、GlobalVarsオブジェクトを取り除き、そのオブジェクトとそのすべての静的変数を作成しました。
GlobalVars.cs using System.Collections.Generic; using UnityEngine; public static class GlobalVars { public static List<GameObject> MobList = new List<GameObject>();
GlobalVarsが使用されたすべてのクラスで、gv変数を削除し、Awake()で初期化します。 すべてのgvをGlobalVarsに置き換えます。 nullの無駄なGlobalVarsチェックを削除します。 GlobalVarsコンポーネントを同じ名前のGOから削除します(GO自体の名前をcfgなどのわかりやすい名前に変更できます)。
この操作の結果を比較するために、変更があるクラスの完全なリストを提供します。
注意、次の部分のネタバレ! :)
bitbucket.org/andyion/habratd-tutorial/commits/db7c1bc0c10c89f45be187e59e0608a2fbb3083dこれで交換は完了です。
次の瞬間に、銃と
Mobの両方の攻撃範囲を調整する際に人生を大きく促進する少しのボーナスを追加します:
bitbucket.org/andyion/habratd-tutorial/commits/18ec053f5f5697abbd3598890aa40306e038d472使用方法:オブジェクトにスクリプトを配置し、インスペクターで範囲を調整します。 強調表示すると、GOの周りに黄色の円が表示されます。これは指示された範囲です。
おわりに
結論として、コードにまだ浅瀬があるにもかかわらず、完全に機能するゲームのプロトタイプを作成できると言いたいです。 NavMeshをいじる時間はありませんでしたが、一見すると複雑なことはありませんでした。