ゲームエンジンUnity3dのスクリプトへの没入、パート1

読者の皆さん、こんにちは! 素晴らしいUnity3dエンジンを使用したゲーム開発に関する記事がHabréで繰り返し公開されています。 これらの記事のほとんどは非常に特定のタスクに専念していましたが、このエンジンに一般的な遠足をしたいと思いました。 この部分は、このエンジンの開発プロセスで私が使用する最も一般的に使用されるスクリプトメソッドとオブジェクトに専念します。 私に最も近い言語のように、JavaScriptで例を示します。

ゲームオブジェクト


MyObjectという名前の新しいゲームオブジェクトを作成します。
var myObject = new GameObject("MyObject"); 
作成されたオブジェクトは、myObjectリンクを介して利用できます。

名前でオブジェクトを検索します。
 var myObject = GameObject.Find("MyObject"); 


タグを使用して、同様のプロパティを持つオブジェクトのグループをマークしたり、単一のシーンで使用したりできます。
タグでオブジェクトを検索すると、単一のオブジェクトが返されます。
 var myObject = GameObject.FindWithTag("MyTag"); 


指定されたタグを持つすべてのオブジェクトのリストを返します。
 var objectList = GameObject.FindGameObjectsWithTag("MyTag"); 


オブジェクトに必要なタグが存在するかどうかを確認してください。 指定されたオブジェクトにMyTagタグがある場合、trueを返します。
 var isCompare = GameObject.CompareTag("MyTag"); 


オブジェクトの破壊:
 Destroy(myObject); 


オブジェクトの作成後1分でのオブジェクトの破壊:
 Destroy(myObject, 60); 


GameObjectにアタッチされたコンポーネントコンポーネントを返します。オブジェクトにこのコンポーネントが含まれていない場合はnullを返します。 たとえば、オブジェクトにバインドされている他のスクリプトにアクセスするために使用できます。
 var objectComponent = GameObject.GetComponent(component); 


タイプcomponentTypeの使用可能なすべてのコンポーネントを返します。
 var objectComponents = GameObject.GetComponents(componentType); 


myComponentをGameObjectにバインドし、それへの参照を取得します。
 var component = GameObject.AddComponent(myComponent); 


ゲームオブジェクトの位置



GameObjectのtransformプロパティには、ゲームワールドでのオブジェクトの位置に関するデータが含まれています。

ゲームワールド内のオブジェクトのグローバル座標を返します。 返される値は、Vector3型で、x、y、zの3つの座標のリストです。

 var position = GameObject.transform.position; var x = position.x; 


オブジェクトをゲームワールドのポイント0、10、0に移動します。
 GameObject.transform.position = Vector3(0, 10, 0); 


グローバル座標の場合と同じですが、ローカル座標を使用します。 ローカル座標は親を基準にしています。 親オブジェクトがない場合、ローカル座標はグローバル座標と一致します:
 var localPosition = GameObject.transform.localPosition; var x = localPosition.x; 


オイラーにあるオブジェクトの回転。 このメソッドは、Vector3オブジェクトの形式で座標も返します。
 var eulerAngle = GameObject.transform.eulerAngles; 


前の例と同じですが、オブジェクトの回転は親オブジェクトを基準にして計算されます。
 var localEulerAngle = GameObject.transform.localEulerAngles; 


クォータニオンに基づくオブジェクトの現在の回転角度。 Quaternion型のオブジェクトを返します。
 var quaternionAngle = GameObject.transform.rotation; 


四元数に基づくが、親オブジェクトに相対的なオブジェクトの現在の回転:
 var localQuaternionAngle = GameObject.transform.localRotation; 


オブジェクトの回転角度をリセットします。
 GameObject.transform.rotation = Quaternion.identity; GameObject.transform.localRotation = Quaternion.identity; 


オブジェクトを指定された方向に毎秒1度の速度で回転させます。 タイプVector3のオブジェクトを座標として受け取ります。 TimeオブジェクトのdeltaTimeメソッドには、前のフレームの実行に費やされた時間(秒単位)が含まれています。
 GameObject.transform.Rotate(Vector3.left * Time.deltaTime); 


前の例と同じですが、親の座標を基準にしたオブジェクトの回転:
 GameObject.transform.localRotate(Vector3.left * Time.deltaTime); 


オブジェクトを指定された方向に毎秒1ユニットの速度で移動します。 また、Vector3クラスのオブジェクトを座標として受け入れます。
 GameObject.transform.Translate(Vector3.up * Time.deltaTime); 


ゲームオブジェクトの物理的性質


GameObjectのrigidbodyメソッドは、その物理プロパティを保存します。 rigidbodyメソッドを使用する前に、ゲームオブジェクトに追加する必要があります。

オブジェクトの速度ベクトルを取得/設定します:
 var velocity = GameObject.rigidbody.velocity; GameObject.rigidbody.velocity = Vector3(0, 1, 0); 


オブジェクトの強度。 摩擦のない環境で速度を落とすために使用できます。 パラシュートを作成するときなど、落下するオブジェクトを遅くするために最もよく使用されます。 パラメータとして整数を受け取ります:
 GameObject.rigidbody.drag = 100; 


オブジェクトへの一括割り当て。 0.1〜10の範囲の質量を使用することをお勧めします。大きすぎる値を使用すると、物理学を計算するときに予測できない結果が生じる可能性があります。
 GameObject.rigidbody.mass = 5; 


重力のオブジェクトへの影響。 ブール値をパラメーターとして受け取ります。 個々のオブジェクトに対する重力の影響を無効にできます。
 GameObject.rigidbody.useGravity = false; 


ゲームオブジェクトに対する物理学の効果。 オブジェクトに対する物理法則の影響を部分的または完全に無効にできます。
 GameObject.rigidbody.isKinematic = true; 


オブジェクトの回転の禁止。 他のオブジェクトとの衝突後でも特定の回転角度を維持する必要がある場合に最もよく使用されます。
 GameObject.rigidbody.freezeRotation = true; 


オブジェクトの重心点の座標を指定します。 既知のVector3オブジェクトの形式で座標を適用します。
 GameObject.rigidbody.centerOfMass = Vector3(1, 0, 0); 


オブジェクトの衝突検出を他のオブジェクトと使用するかどうか。 これをオフにすると、オブジェクトは衝突を無視します。
 GameObject.rigidbody.detectCollisions = false; 


オブジェクト間の衝突検出モード。 いくつかの異なるモードを指定できます。
CollisionDetectionMode.ContinuousDynamicは、高速で移動するオブジェクト用です。
CollisionDetectionMode。高速で移動するオブジェクトとの衝突の連続。
通常の衝突の場合はCollisionDetectionMode.Discrete(デフォルト)。
衝突検出に問題がない場合は、デフォルトのプロパティを使用することをお勧めします。

オブジェクト密度の設定:
 GameObject.rigidbody.SetDensity(1.5); 


指定されたベクトルでオブジェクトに運動量を適用します。 パルスを適用した結果、オブジェクトはパルスの強さに比例して移動します。
 GameObject.rigidbody.AddForce(5, 0, 0); 


(オブジェクト)座標系のベクトルを持つオブジェクトに運動量を適用します。
 GameObject.rigidbody.AddRelativeForce(0, 0, 5); 


オブジェクトにトルクを追加します。 このメソッドを使用すると、オブジェクトは重心GameObject.rigidbody.centerOfMassを中心に回転します。
 GameObject.rigidbody.AddTorque(0, 1, 0); 


前の例と同じですが、オブジェクトの座標に相対的です:
 GameObject.rigidbody.AddRelativeTorque (1, 0, 0); 


外部指定ポイントからオブジェクトにインパルスを適用します。 オブジェクトの移動と回転を同時に行います。 たとえば、オブジェクトに入る弾丸をシミュレートするために使用できます。 最初のパラメーターは力の方向ベクトルを示し、2番目のパラメーター-力の方向の開始点を示します。
 GameObject.rigidbody.AddForceAtPosition(Vector3(0, 5, 7), Bomb.transform.position); 


Unity3Dには、体積爆発を完全にシミュレートするための別の方法があります。 メソッドの最初のパラメーターでは、パルスパワーを指定できます。2番目のパラメーターは、パルスの発生点、3番目のパラメーターは、パルス伝播の半径、4番目のパラメーターは、力分布球の圧縮修飾子、5番目、オプション、使用するパルスのタイプを示します:
 GameObject.rigidbody.AddExplosionForce(power, explosionPos, radius, 2.0); 


オブジェクトを「眠りに落ちる」ようにし、それに対する物理的なインジケータのさらなる計算を禁止します。
 GameObject.rigidbody.Sleep(); 


オブジェクトが「眠りに落ちた」かどうかを確認します。
 GameObject.rigidbody.IsSleeping(); 


物理学の影響をさらに適用できる可能性があるオブジェクトを「ウェイクアップ」します。
 GameObject.rigidbody.WakeUp(); 


レイトレーシング


Unity3D開発で最も一般的に使用されるオブジェクトの1つはRayです。 このオブジェクトを使用すると、指定したポイントから指定した方向に光線を放出し、彼が達成できたオブジェクトのプロパティを返すことができます。

RaycastHitクラスのオブジェクトを作成します。このオブジェクトには、ビームが衝突したオブジェクトに関する情報が含まれています。
 var hit : RaycastHit; 


rayPosition位置からrayVectorの方向に50単位の長さの光線を送信し、光線が衝突したオブジェクトをヒット変数に入力します。
 Physics.Raycast(rayPosition, rayVector.forward, hit, 50); 


ビームが衝突したオブジェクトまでの距離を取得します。 距離はビームの長さを超えることはできません。
 var distance = hit.distance; 


ビームが衝突したオブジェクトの名前を取得する必要がある場合があります。 これを行う最も簡単な方法:
 var objectName = hit.collider.gameObject.name; 


オブジェクトタグを取得するには、次のメソッドを使用します。
 var Tag = hit.collider.tag; 


Unity3Dには、非常に有用ではなく、さらに多くの異なるメソッドとオブジェクトが含まれています。 残念ながら、それらの完全なレビューはすでに長い記事を増やしますので、私はそのような機会があれば、今後さらに詳細に話そうとします。 経験豊富な開発者に、より興味深いプロジェクト、そして初心者-成功と興味深い発見を願っています。 この記事にご関心をお寄せいただきありがとうございます。

UPD。 2番目の部分 (スクリプト化されたイベント)。

Source: https://habr.com/ru/post/J128711/


All Articles