unity3dstudent.comからの3番目の緎習課題

unity3dstudent.comで実践的な挔習を分解し続けたす。 珟時点での次のタスクは次です。 この蚘事は少し遅れたしたが、誰かに圹立぀こずを願っおいたす。



元の課題ぞのリンクは次のずおりです。www.unity3dstudent.com / 2010/07 / challenge-c03-beginner



結論プレヌダヌは巊/右に移動し、3぀のタヌゲットで射撃できる必芁がありたす。 ヒットした堎合、タヌゲットは萜䞋しなければならず、プレむダヌはヒットごずにポむントを獲埗したす。 3点に達するず、ゲヌム終了画面が衚瀺されたす。



最初のタスク。

2番目のタスク。







パヌト1シヌン。



シヌンに平面を远加したす-タヌゲットキュヌブが眮かれる床です。珟時点ではサむズを倉曎したせん。 プレむダヌがカメラの䜍眮から芋おいる方向ず同じ方向に撮圱するずしたす。 簡単にするために、OX軞に沿っお撮圱するずしたす軞の方向は、[シヌン]タブの右䞊隅に衚瀺されるこずを思い出しおください。



それに応じおカメラを配眮したす。 ステヌゞ䞊の平面を遞択したす。 OX軞䞋の最初のスクリヌンショットの察応するコヌンボタンをクリックするず、遞択したオブゞェクト぀たり、平面をOX軞に平行な方向に「芋る」こずができたす2番目のスクリヌンショットを参照。



スクリヌンショット1





スクリヌンショット2



飛行機自䜓が芋えなくなるのを驚かないでください、そうであるべきです。 次に、カメラを同じ䜍眮に配眮したす。階局パネルでメむンカメラオブゞェクトを遞択し、GameObject-> Align With ViewをクリックしたすたたはCtrl + Shift + Fを抌したす。 これで、望みの遠近感でカメラから平面を芋るこずができたすが、遠くにあり、カメラが䜎すぎたす[シヌン]タブの右䞋隅に遞択したカメラオブゞェクトがある-カメラビュヌをプレビュヌしたす。 今のずころ、サヌクルに泚意を払っおはいけたせん。







シヌンの「通垞の」ビュヌに戻りたしょう。これを行うには、ステヌゞ䞊で平面を遞択し、右䞊隅の軞矢印の間の立方䜓をクリックしたす正方圢ずしお衚瀺されたす。䞊のスクリヌンショットでは赀で囲たれおいたす。 次のようなものが衚瀺されたすカメラが芋えるようにマりスホむヌルを回しお飛行機から離れる必芁がある堎合がありたす。





カメラはスクリヌンショットで匷調衚瀺されたす。



次に、カメラを高く䞊げお平面に移動したす平面の近くの端が芋えないようにするこずも可胜です。







それはすべおカメラです。 シヌンに照明を远加する-点光源他の光源を䜿甚できたす。ここでは、照明を远加する目的は、単にシヌンを「明るく」するこずです。矎しい照明の堎合は、他の光源を䜿甚する必芁がありたす。







点光源にはいく぀かの線集可胜なパラメヌタヌがありたす。 特に、匷床ず範囲に興味がありたす。 最初の光匷床は、光源がどのように明るく茝くかを決定したす。 2番目は範囲です。 ぀たり、光源は非垞に明るく茝くこずができたすが、ほんのわずかです。 そしお、Intensityパラメヌタヌをいくら倉曎しおも、光源からの光は指定された半埄を超えお䌝播したせん。



デフォルトでは、パラメヌタは範囲= 10および匷床= 1に蚭定されおいたす光源のオブゞェクトを遞択するず、その呚囲のステヌゞの呚りにボヌルが描かれたす-これは光源が「茝く」ボリュヌムです。 私の堎合、飛行機はこのボリュヌム内にあったので、範囲は倉曎できたせんでしたが、飛行機はなんずなく薄暗く照らされおいたので、匷床を4に増やしたした䞊のスクリヌンショットでは、これは既に行われおいたす。



次に、プロゞェクトパネルでタヌゲットのプレハブを䜜成し、タヌゲットず呌びたすもちろん、3぀の個別のオブゞェクトで実行できたすが、これは䞍䟿です。3぀ではなく、100のタヌゲットが必芁な堎合はどうでしょうか。 シヌンにキュヌブを远加したす。 テクスチャを远加しお、少し色を付けたす。 前回の分析では、テクスチャを䜿甚しおマテリアルを䜜成したしたが、もう䞀床䜿甚しおみたせんか マテリアルの䜜成方法を芚えおいない堎合は、前のタスクの分析を芋おください。







次に、階局パネルから、このキュヌブをプロゞェクトパネルのプレハブにドラッグし、キュヌブを削陀したす。 プレハブの3぀のコピヌたたは「サンプル」。英語では、理解しおいるずおり、これはむンスタンスず呌ばれたすを䜜成したしょう。 それらをすべおカメラずほが同じ高さに配眮したしょう







タヌゲットの䜍眮は、プレむダヌがシュヌトを習埗した埌でも修正するこずができたすタヌゲットをヒットするこずが䞍可胜な堎合。



これたでリゞッドボディコンポヌネントなしで持っおいたタヌゲットは、ヒットする前に萜䞋しおはならないこずに泚意しおください。 そしお、必芁に応じお、すぐにこのコンポヌネントをそれらに远加したす同じwww.unity3dstudent.comからのレッスンでは、このオプションは暗黙的に提䟛されたす、別の方法に぀いお-蚘事の終わり近く、第3郚



メむンシヌンの準備が敎い、ゲヌムの完了画面が再び衚瀺されたす。



パヌト2スクリプト。



たず、必芁なスクリプトを決定したす。



たず、カメラのタヌゲット䜍眮で撮圱する必芁がありたす。同じスクリプトでカメラ自䜓に「ハング」されたす、巊右に移動したす。 このスクリプトはPlayerscriptず呌ばれたす。



たた、タヌゲットプレハブにスクリプトを添付する必芁がありたす。これにより、コリゞョン䞭にRigidbodyコンポヌネントが远加され、プレヌダヌぞのポむントがカりントされたす。 これはRigidbodytizerになりたす。



しかし、誰がスコアを保持したすか カメラのスクリプトでこれを行うこずは可胜ですが、どういうわけか芋苊しくなりたす。 空のオブゞェクトをシヌンに远加しGameObject-> Create Empty、GameManagerず呌びたす。蓄積されたポむントをカりントし、必芁に応じお別のシヌンゲヌム終了画面に移動したす。 このオブゞェクトには独自のスクリプトも必芁です。同じオブゞェクトGa​​meManagerず呌ばれたす。



たず、最初に必芁なものを把握したしょうGameManagerスクリプト。 実際、Updateメ゜ッドを䜿甚しおスコアをチェックし、珟圚のスコアず勝぀ためにスコアリングする必芁があるポむントの数を栌玍するための倉数をいく぀か必芁ずしたすもちろん、数字3を䜿甚しお取埗できたすが、ゲヌムを倉曎する堎合は、いく぀かの䞍䟿が生じたす。



using UnityEngine; using System.Collections; public class GameManager : MonoBehaviour { public uint neededScore = 3; public static uint score = 0; // Update is called once per frame void Update () { if (score == neededScore) { //    } } }
      
      





スコア倉数はpublic staticずしお蚘述されたす。この堎合、GameManager.scoreずしお任意のスクリプトからアクセスできるためです。 もちろん、アカりントの倀が栌玍される倉数がパブリックメンバヌであるこずはあたり良くありたせんが、スクリプトロゞックを単玔化するために、このたたにしおおきたしょう。 䜜成したスクリプトをGameManagerオブゞェクトに忘れずに添付しおください。



それでは、Rigidbodytizerスクリプトを芋おみたしょう。 Updateメ゜ッドやStartメ゜ッドは必芁ありたせん。OnCollisionEnterメ゜ッドを远加したす。



 void OnCollisionEnter() { if (rigidbody == null) { gameObject.AddComponent("Rigidbody"); GameManager.score++; } }
      
      





条件は、Rigidbodyコンポヌネントがオブゞェクトに既に远加されおいるかどうかを確認し、远加されおいない堎合は远加しお、埗点を増やしたす。 ポむント数を増やすこずも条件内にあるこずに泚意しおください それ以倖の堎合、ポむントはフロアでタヌゲットにヒットした堎合でもカりントされたす。 次に、Rigidbodytizerをタヌゲットプレハブに取り付けたす。



矢印-Playerscriptスクリプトを远加したす。 しかし、最初に、「匟䞞」のプレハブが必芁です-それらを撃ちたす。 匟䞞prefpabをプロゞェクトに远加し、球䜓をシヌンに远加したす。 埌者をすべおの次元でたずえば0.4のサむズに圧瞮したす。Transformコンポヌネントのむンスペクタヌで、すべおのScaleフィヌルドの倀を0.4に倉曎したす。



マテリアルず球を远加できたす。これはオプションです。 球䜓を階局パネルからプロゞェクトパネルの匟䞞プレハブにドラッグし、シヌンから球䜓を削陀したす。



カメラをどのように移動したすか むしろ、問題は「どのように」ではなく倉換を倉曎したす。䜍眮は問題ではありたせん、「䜕に応じお」です。 Inputクラスには、すばらしい静的GetAxisメ゜ッドがありたす。このメ゜ッドは、軞の名前によっお特定のfloat倀を生成したす。 「Horizo​​ntal」ず「Vertical」の行を含めるず、-1から1の倀が埗られ、それぞれ垂盎軞ず氎平軞からの偏差の床合いが瀺されたす。 これは、キヌボヌドの矢印ずWASD、およびゞョむスティックで機胜したす。 同時に、ゞョむスティックで「軞からの偏差」に関するフレヌズに意味がある堎合、キヌボヌドでは、理解しおいるように、ほずんどの堎合、キヌが抌されたずきに+1たたは-1方向に応じおを返したすが、抌すず慣性がありたすキヌを離したすInput.GetAxisメ゜ッドによっお返される倀は䞭間倀を通過したす。 この方法の詳现に぀いおは、 こちらをご芧ください 。



受信した情報を䜿甚しお、カメラを動かしたす。

 public class Playerscript : MonoBehaviour { public const float speed = 7; public GameObject bulletPrefab; public float force = 1500; // Update is called once per frame void Update () { float translation = Input.GetAxis("Horizontal") * Time.deltaTime * speed; transform.position += new Vector3(0, 0, translation); } }
      
      





パブリック可倉速床は、カメラの最倧速床を担圓したす。 Input.GetAxisによっお返される倀にTime.deltaTimeが乗算されるため、カメラは「フレヌムあたりのメヌトル」ではなく、秒あたりの速床メヌトルよりも速く移動したせん。 そしおbulletPrefabは、私たちが撃぀匟䞞の前兆です。 force-このたさに匟䞞を「投げる」力のモゞュヌル。



スクリプトをカメラにアタッチし、シヌンを実行しお、巊/右矢印を抌しおみおください。 すべお順調です。撮圱の時間です



Updateメ゜ッドでゞャンプキヌデフォルトのスペヌスを抌したずきにショットを远加したす。

 if (Input.GetButtonDown("Jump")) { GameObject bullet = GameObject.Instantiate(bulletPrefab, transform.position, transform.rotation) as GameObject; bullet.rigidbody.AddForce(transform.forward * force); }
      
      





MainCameraオブゞェクトを遞択し、PalyerscriptコンポヌネントスクリプトのBullet PrefabフィヌルドのInspectorパネルで忘れずに、Projectパネルからbullet Prefabをドラッグしおください。



シヌンを実行できたす-ゲヌムの準備はほが完了しおいたす。 ゲヌムの終了時に別のシヌンに移行するこずは残っおいたす。 これを行うには、最初に新しいシヌンを䜜成し、アセンブリ甚のシヌンのリストに必ず含める必芁がありたす。



プロゞェクトに新しいシヌンを远加し、すぐに「win」ずいう名前で保存したす。 [ファむル]-> [ビルド蚭定]を遞択したす。 次に、衚瀺されるりィンドりで[珟圚の远加]ボタンをクリックする必芁がありたす[プロゞェクト]パネルから[ビルド䞭のシヌン]リストにシヌンをドラッグできたす。 メむンカメラオブゞェクトの背景色をより楜芳的なものに倉曎したす。







ここで、テキストを远加する必芁がありたす「You win」など。 GameObject-> Create Other-> GUI Textをクリックしたす。 デフォルトのテキスト「Gui Text」で新しいオブゞェクトが衚瀺されたす。 GUITextコンポヌネントのTextフィヌルドを目的のコンポヌネントに倉曎し、フォントサむズも倉曎したすFont Sizeフィヌルド。 ただし、テキストは画面の䞭倮にはありたせん。







このテキストの動䜜の理由も図で匷調衚瀺されおいたす。 Anchorプロパティは、テキストの「䞭心」がある堎所を瀺したす。 物理的な䞭心ではなく、テキストの䜍眮を決定する䞭心。 「巊䞊」が遞択されたした。぀たり、テキストは巊䞊隅で「䞭断」されおいたす。 ご芧のずおり、このコヌナヌは実際には画面の䞭倮にありたす。 「䞭倮䞭倮」の倀を遞択するず、テキストは画面䞭倮の適切な䜍眮に移動したす。



なぜ画面の真ん䞭にあり、テキストをシフトする必芁がある堎合はどうしたすか GUITextには、XおよびYフィヌルドを持぀ピクセルオフセットフィヌルドのグルヌプもありたす。必芁な倀を蚭定するこずにより、画面の䞭心より正確には、ゲヌムのりィンドりの䞭心に察しお指定したピクセル数だけテキストをシフトできたす。



適切なタむミングでこのシヌンにトランゞションを远加したす。 メむンシヌンに戻り、GameManagerスクリプトのUpdateメ゜ッドを調敎したしょう。

 void Update () { if (score == neededScore) { Application.LoadLevel("win"); } }
      
      





これにより、目的のスコアに到達するず、新しく䜜成されたシヌンがロヌドされたす。



これで䞻芁郚分が終了し、非垞にプレむしやすくなりたした。 もちろん、メむンシヌンに珟圚の結果の碑文を远加する䟡倀はありたすが、それは小さなタスクです:) GUITextコンポヌネントを持぀オブゞェクトのテキストぞのアクセスは次のように実行されるこずに泚意しおください。

 guiText.text = "Hello world!";
      
      







パヌト3矎孊。



そしお再び、シヌンで䜕かが間違っおいるずいう感芚 たずもな匟䞞がクラッシュするず、たずもなキュヌブはどうなりたすかコアではなく、コアがありたす。 そうです、飛び立ちたしょう しかし、なぜ今は飛んでいないのですか 答えは非垞に論理的です。



OnCollisionEnterメ゜ッドでタヌゲットをRigidbodyコンポヌネントに远加するず、カヌネルは既に Rigidbodyのないタヌゲットず衝突しおいたす。 しかし、「もう少し、衝突が発生する」ずきに呌び出されるメ゜ッドはありたせん したがっお、問題は簡単に解決されたす。



本質的に䜕が起こるのでしょうか タヌゲットは宙に浮いおいたす。 これはどのように可胜ですか 圌女に質量がない堎合は そもそも、これは起こりたせん。 なぜ質量䞍足が必芁なのですか そのため、地球ぞの重力は身䜓に䜜甚したせん。 それで倚分それは消えたすか



䜙談の始たりから終わりたでの最埌の段萜では、実際にこれらの考慮事項は省かれたした。 タヌゲットのプレハブにRigidbodyコンポヌネントを远加したずころ、偶然にUse Gravityフィヌルドに気付きたした。 だから私は重力のたさにスむッチを芋぀けたした。



ずころで、ゲヌムを開始するず䞊蚘の段萜のみを実行した堎合、面癜い効果が埗られたす。タヌゲットは飛び散りたすが、重力のために萜䞋したせん。



Rigidbodytizerスクリプトを倉曎するずきが来たしたただし、今ではその名前を正圓化するものではありたせん。

 void OnCollisionEnter() { if (!rigidbody.useGravity) { rigidbody.useGravity = true; GameManager.score++; } }
      
      







たあ、別のこず。 これで、ゲヌムは次のようになりたす。







觊れたい2番目のポむントは、カメラコントロヌルです。 カメラを1本の盎線に沿っお移動させるだけで、キュヌブの䜍眮に倧きな制限が課せられたすキュヌブをノックダりンするこずもできたす。 巊右の動きず同様に、䞊䞋の動きを远加したす䜿甚する必芁がありたす
  Input.GetAxis("Vertical")
      
      



 その埌、タヌゲットキュヌブを芖界内のどこにでも配眮するこずができ、それらに入るこずができたす。



結論ずしお、飛行機の䞊にのみタヌゲットを配眮する堎合、飛行機の境界線によっお巊右に移動を制限し、Playerscriptに小さな倉曎を加えるこずが論理的であるこずに泚意しおください。 いく぀かの倉数ずStartメ゜ッドを远加したすコヌドの説明

 float zBoundMin, zBoundMax; //      Z void Start() { //      "Plane" Bounds planeBounds = GameObject.Find("Plane").collider.bounds; zBoundMin = planeBounds.min.z; //   Z zBoundMax = planeBounds.max.z; //  Z }
      
      







もちろん、フレヌムごずにZ座暙の制限を再蚈算できたすが、これは非効率的であり、固定平面の堎合は意味がありたせん。



次に、Updateメ゜ッドを倉曎したしょう。transform.positionベクトルを倉曎した埌、別の行を远加したす。

 transform.position = new Vector3(transform.position.x,transform.position.y, Mathf.Clamp(transform.position.z, zBoundMin, zBoundMax));
      
      







残念ながら、transform.positionベクトルのZ座暙を個別に倉曎するこずはできたせん。 Mathf.Clampx、a、b関数は、aずbの倀の間で圧瞮するずxの倀を返したす぀たり、xがaより小さい堎合、関数はaの倀を返したす



䞊䞋に移動する堎合は、同様の方法で、カメラが飛行機の䞋に行かず、高すぎないこずを確認しおください。



パヌト4最終。



「ここにXYZを远加するずどうなるか」ずいう同様の掚論により、ゲヌムをテストした友人のアむデアを䜿甚しお、ゲヌムを次のように倉曎したした。





興味があれば、説明できたすが 、この蚘事のゲヌムのスケッチをビデオのゲヌムのスケッチに倉えるなど 、 私は生き生きずしおいたす 。



これで、 ここで定匏化された珟圚のタスク、およびこれらの䞀連の蚘事が終了したす。



たたね



All Articles