【東パソ非公式Unity独断補足解説】横スクロールアクション【RayCast,Onlistほか】(放送46~47回、78~79回、85~86回対象)

東パソ非公式Unity独断補足解説

今回の内容は、初心者であるオジサンが、Unityをはじめるとどうなるか、東パソで紹介されたUnityでゲーム「横スクロールアクションゲーム」を作れるかを検証する動画です。主な内容としてはRayCast、Onlistなどがあげられます。(4-006)

ええ、うp主こと、この動画のUP主のひろじいです。

この動画シリーズは今のところ、非公式ですが、2025年春まで放送された「東京パソコンクラブ 〜プログラミング女子のゼロからゲーム作り〜」に関する内容でお送りしています。

ええと放送当時のUnityのバージョンと現在普及しているバージョンの違いがあって、多少放送時のプログラムソースの記述が異なるものも登場することがあります。また、第79回11分23秒とか時間の紹介がありますが、放送をご覧になる環境によって多少ズレるので、参考程度にお聞きください。

さて、いきなりですが、今回一番難しいというか、間際らしい内容が出てくるのでまずそれをサラッと紹介します。

第79回11分23秒あたりから、ナナメのオブジェクトに対しての当たり判定をうまく行う、という内容がはじまるのですが、まあ、本編では進行方向に見えない光線のようなものを当てて判定する・・・ようするに先回りして当たり判定をする、という話がはじまるのですが、そんなに詳しく解説されずにサラッと通り過ぎるんですよ。特に入力もせず、先にスタッフというか小林先生が作っておきました・・・というところで、コピペして終わり・・・という感じなんですね。で・・・早い話、「ナナメのオブジェクトに対しての当たり判定」をここで、サンプルを独自に作っておきます。それからもう一回第79回の話をしますので、最終的には今回の「横スクロールアクションゲーム」にも組み込まれているという、流れにしますね。

いままでの知識でのCircle Collider2Dを使った判定ですと、「ガクガクッ」としたような動きになるんですね。(動画4分36秒の図に矢印を加筆)

それをスムーズにしたい。(動画の2分54秒の図に矢印を加筆)

この違いは何か?という話ですので、お聞きください。

「進行方向に見えない光線のようなものを当てて判定する」・・Raycastって言うんですよ。だからここは、初心者の壁というか・・・そういうものだと思うしかないですね。Rayが「光線」で、castが「投げる」という意味ですが、「光を投げかける」みたいな感じですね。

それで、Copilotさんがいい感じでまとめてくれたのですが、Unityのね。いままでの内容も含んでいますが

言葉意味
Collider(コライダー)「当たり判定の形」=見えない壁
Rigidbody「重さ」や「転がる」などの動きの仕組み
Raycast(レイキャスト)「見えない光線」=地面があるか確認する探知機
坂道で起こる問題「転がりすぎ」「浮く」「止まる」など
解決法光線(Raycast)で地面を自分でチェックする

Raycast(レイキャスト) と呼ばれる方法は「見えないレーザーを下に飛ばして、坂に触れてるかを調べる」仕組みです。

たとえばキャラの足の位置から下にレイを出して、

「地面に当たった!」となったら「地面に立っている」と判断します。

「物理エンジンだけに任せると『接触したかどうか』が不安定ですが、

Raycastを使えば『自分で正確に接地判定できる』ということですね。今回は「下に光線を出すだけの話をしているんだ」と理解してください。これだけでも十分「ナナメのオブジェクトに対しての当たり判定をうまく行う」ことがきますのでね。最終目的は「横スクロールアクションゲームを作る」ですので、安心してください。

それで、光線の先の位置として、つまり足元に空のオブジェクト、例えば名前を“Ground Check”として、プレイヤーの下に置くんですね。キャラクターの足元に透明で小さいGround Checkオブジェクトを重ねて、そこから下の方向に見えない光線を出して検知する、ということを行います。

プレイヤーの名前もRaycasttestplayerとしていますが、いままでのプレイヤーからのアレンジで作ったものですね。

それで、今回の重要となる部分をピックアップすると・・・

まず、5行目、これは従来の定義と同じRigidbody2Dを使うときの宣言ですね。

そして、移動速度、ジャンプと続きまして・・・8行目 LayerMask groundLayerですね。これはボンバーマンの回からよく出てくるようになった、タグですね。これに近い・・・各オブジェクトにレイヤーもタグと同じように設定できるようになっていまして・・・

ほら・・・となりにあるじゃないですか・・・衝突した時にどの名前のレイヤーか?というのを

判別できるんですね。まあ、タグとどう違うのか?というと

まあ、主な目的でちがいますね。

まあ、それで8行目 LayerMask groundLayerですね。衝突した時にその衝突したレイヤーの名前を持ってきて、判定をするために使います。

そして9行目Transform groundCheckですね。

さきほどの・・・Groundcheck・・・こちらの位置の情報を知りたい時に持ってくるという・・そのための変数です。

それで14行目void Updateということで、更新時に、呼ばれたらその都度ということですね、毎回、このカッコの中を実行するということで

何を実行するのかというと・・・地面チェックをCircleCastに変更・・・何かわかりにくいたいとるですけれども・・・ようするに、ここからRaycastの準備をしているのだということで、

まず定義ですね。

さあ、ここが新しい命令です。まあ、さっきのLayerMaskも新しかったですが、この私が話しているこのコーナーの最大の重要命令が・・・ですね・・・えー

RaycastHit2Dですね。今回の動画は、もうここ。ここだけでも覚えていただきたい

ええと17行目ですね。RaycastHit2D この命令でhitという名前の構造的な変数ですね。これはというと以下のものを代入しています。ということで

イコール Physics2D.Circlecast(  このカッコの中身が23行まで続いているということで・・・えー

まず一つ目の引数が18行目、groundcheck.position, コメントにもありますがそのままの意味で「足元の位置」ですね。それでね。groundcheckってさっき9行目でGroundcheckオブジェクトの位置だと言ったじゃないですか。だからその位置情報をそのまま持ってきているんですよね。

そして、19行目、半径ですね。半径ですが、まあ幅と考えてもいいでしょう。適正な半径でないと誤作動をおこしますので、ここはそんなパラメーターであると思って下さい。

それで次は20行目、下方向に設定しますよ・・・と。

次に21行目、「少しだけ下を見る」これは何をやっているのかというと、groundcheckの位置からさらにずらしているんですね。なんでかというとそうしないと完全に一致しているとまさに自分と混同してしまうおそれがある・・・うまく判定できないからですね。ほんの少しだけずらしてやることで自然な判定ができるんですね。なんかナナメの図形とか座標が整数でなくていろんな小数がでてきそうじゃないですか。だから、少し離れた位置でないと判定ミスが起きやすくなるという・・・そういう事故防止という理由ですね。

そして、22行目、最後の引数ですね。単にgroundLayerと書いていますが、ここは8行目のこれですね。LayerMask groundLayerですね。衝突した時にその衝突したレイヤーの名前を持ってきて・・・これね・・・先にInspectorでの状態をおみせしましょうか

groundLayerにここはLayerの種類を設定できるんですが、今はGroundになっていますね。デフォルトだと、Nothingになっているはずです。ここの名前が、相手のレイヤーの名前が一致、つまり“Ground”だと有効、相手のレイヤーが別の名前なら無効になります。

※レイヤーのデフォルトの時はDefaultです。

ええとですね。ここで、選択肢にGroundが最初からある様にみえますが、実は自分で作らないといけません。地面となるオブジェクト・・・ココ最近ではよく使っているWallというプレハブのオブジェクトですね。これもまたボンバーマンの動画からのものですが・・・

ちょうどLayerのところの選択肢の下にあるAdd Layerから書き込むんです。このオブジェクトはGorundというレイヤーとして設定しておく・・・そしてPlayerの方も同じくGroundにしておけば、連絡がとれるということです。

で・・・ここまでが準備ですね。でも、もう設定完了です。

あとは、有効かどうかという話です。

それでね、このプログラムはAI・・・Copilotが作ったものですから、僕も最初はね・・・25行目と41行目はよくわかりませんでした。

―――――――――――

25行目(isGrounded = hit.collider != null;)と41行目(Color color = isGrounded ? Color.green : Color.red;)は、どちらも「条件によって値を切り替える」処理で、特に41行目の ? は 三項演算子(さんこうえんざんし) と呼ばれる、 if文の省略形です。(以下3つの画像はCopilotからの回答)

✅ まとめ:2つの行の意味

処理内容
isGrounded = hit.collider != null;地面に当たっているかを判定if (hit.collider != null) isGrounded = true; else isGrounded = false;
Color color = isGrounded ? Color.green : Color.red;緑か赤かを選ぶif (isGrounded) color = green; else color = red;

まあ、それで、ここまでは理解できたとして、次に、ここで余計なことを言うとかえって混乱する人もいるかもしれませんが・・・Unityにとってですね、今回の改善というか、接地の判定方法を足元にRaycastとして変更してさえしていれば、スムーズに移動できる様に見えるということです。このプログラムは判定の場所を足元に変更しておけば、「ナナメのオブジェクトに対しての当たり判定」は完了するということです。

ここでやっていることは、「設置判定の場所を足元に変更しますよ」ということで、あとは何もしていないんですね。なぜなら、残りの衝突とかは自動なので。自動だから記入しなくていい。考えなくていいというところがポイントですね。

うーんとね。これはBASICに慣れた人の頭で考えると・・・接地判定をしただけじゃ、あとなんか命令しないとダメじゃないかな?という不安が残るんですね。でもそこはCollider系をInspectorに両方置いておけば自動で行ってくれるので、もう終わっているんです。もう完了しているんですね。ええと盆場マンの時は、・・・今回は盆場マンの時の話が何回もでてきますが・・・ええとColliderを置いてから何か命令を追加したんですけれどそれはInstantiate命令であって、あれはオブジェクトの複製でしたよね。増加というか・・・あれとごっちゃになると大変ですね。区別して命令を理解しないと大変です。今回の命令は、何回もいいますけど、接地する判定の位置の情報を変更しているだけなんですよね。それだけで、「ナナメのオブジェクトに対しての当たり判定」はスムーズになっている様にみえるということです。

まあ、もう一言加えると、ぶつかったのが「Ground」のレイヤーだったらという条件付きですよね。なので、ここでもif文みたいな条件式は省略されていると言ってもいいんですよ。あまりにも省略されているものが多すぎて逆に不安になるということですが、まあ、しっかりソースを見ていれば理解できるという話です。

それでは完成したソースとインスペクターをみてみましょう。

Raycasttestplayer.cs

Raycasttestplayer – Inspector

Groundcheck  – Inspector

そして実行結果は(動画の17分40秒)

接地しているときは下に判定用の直線が緑、ジャンプすると赤になっているのがわかりますね。

さて、長くなりましたが、あとはこれの応用ですので、ここから先は、まあ、ほとんど簡単な話です。

全体で4部構成です。

それで、放送当時は第46回、第47回で一旦終了してますね。このときはあやてぃーさんと弓木さんの二人でしたね。それからその後ほかの内容に移って第78回と第79回、

林 瑠奈(はやし るな)さんを加えて、横スクロールアクションゲーム、これはunityroomでの「東パソアクションRTA(りあるたいむあたっく)」ですね。このあたりの話になります。そして、そのアレンジ版である「東パソアクションRTA Ver.2」の話が第85回と第86回になります。

だから、このあたりが放送ではとびとびの回ではありますが、今回は一連の流れで「横スクロールアクション」の完成までを補足を加えながら紹介します。

第1部は第46回から第47回の内容で、「カメラの設定と落ちたらスタート」

横スクロールアクションならではのキャラクターを追っかけるカメラの設定、そして、アウトの判定ですね。地面から落下したらアウトということで、この時の放送回の内容にあわせて、アウトになったらスタートの位置に戻るという設定の話ですね。ここの声の担当はまりささんです。

第2部は第78回から第79回の内容で、「タイマーとゴールを付ける」です。タイマーを作って、ゴールしたらタイマーがストップする仕組みを作るということで、基本的な構造はほぼ完成する段階です。ここの声の担当はれいむさんです。

ゆっくりしていってね。

第3部は第85回ですね。「チェックポイントをひとつ作る」です。新しい要素としてonlistがでてきます。ギミックとかでオブジェクトを加えたり消したりするのに整理して使える機能です。あと、今、第85と言ったばっかりだったんですけれども、実は第78回の内容でやりのこしていた内容がありまして、キャラクターの向きに合わせた画像の反転ですね。だからここは正確には(第85回+ちょっと第78回)ということで・・・・第85回+αです。第78回27分でX軸のスケールを-1倍にすると画像を反転するという内容を含みます。あああ・・・いやあ、前回の「ぴよキャッチ」で別の方法で画像反転を行っていましたが・・・放送されていたので、こちらはまた別の方法ということで紹介しますね。ここの声の担当はB2子先生です。

第4部は第86回で、完成までのブラッシュアップの内容です。ここの声の担当はB子さんです。

・・・という訳で、続きをどうぞ。

1.カメラの設定と落ちたらスタート

それじゃあ、第1部である第45回と第46回の内容、「カメラの設定と落ちたらスタート」の話を、まりさが担当するぜ。

うp主がサンプルプログラムとか言っていたプログラムをベースにして、Yokoacplayer.csとして書き換えて、キャラをこんな丸っこいキャラにして、ドンキーコングの最初の25mの面みたいにナナメの床を加えた状態がこれだな。

プレイヤーのソース名をRestcastplayer.csからYokoacplayer.csに変更。

キャラの画像の名前はYokoAction.pngだ。

左右の移動は矢印キーのままで、第46回の放送ではジャンプをCキーに設定しているが、

第78回ではジャンプは好みのキーで設定となっているので、この動画ではジャンプはSpaceキーにしてあるぞ。

本編の放送では第46回13分15秒から「シカックマン(仮」という今回の横スクロールアクションゲームが紹介されているぜ。(仮)の右側のカッコは無かったので、タイトルは間違っていないぜ。それで、この第46回の内容紹介は14分12秒から。①移動速度とジャンプ力を変更②横スクロールを設定という、ここまでを作成しようという話を佐藤璃果さんがナレーションしてくれていたぜ。

①移動速度とジャンプ力を変更

それで、こちら側では速度は5、ジャンプ力は8という初期値だな。ここで速度を20にしてみる。

次にジャンプを20に変更してみる。

めちゃくちゃジャンプ力があがって、高く上がって、落ちるまで時間がかかるよな。

あたまゴツンゴツンだぜ。

まあ、正直、こんな内容で遊びながら調整するという感じだったのだが、

ここで本編と比較してみると、

第46回14分40秒で速度が256、ジャンプが512、重力が1024という数値が見える。まあ、放送と全く同じ設定をここで表現するのは限界があるし、この数値というのは環境によって異なるものと理解してほしい。また、うp主が重力の話を完全に省いているのは、

Rigidbody2DのGravity Scaleを1以上にして、こちらで調整するほうが、重力表現が自然だし、ここを自動にさせることによって、プログラミングが簡易になって省けるので、そのようにした、ということだ。ということで、放送では重力の変更の話もあったが、この動画では省かせていただくよ。では、次の話に移るぜ。

②横スクロールを設定

第46回17分18秒から

横スクロールを設定、というのは、Unityの場合では、言い換えるとキャラクターの動きにあわせてカメラを移動させる、ということだ。まあ、このとき小林先生はほかにも方法がある、とも言っていたが、要するに数ある横スクロールの方法の一つということだ。それで第46回での話では、タテは固定して、ヨコはキャラクターについていく、という話になっている。別の放送回で、タテについていくようにするので、カメラの操作に慣れていくつもりで話をきいてほしい。

第46回17分38秒、ヒエラルキーのMainCameraをドラッグ&ドロップしてPlayer、この動画ではYokoplayerのところに持っていく、と小林先生がおっしゃっていたので、そうする。

そうしたいが、そういう動画を収録していないな!そうか・・・今、気づいたが、単にタテもヨコも追っかける場合には、まあ、座標の調整とかあるが、プレイヤーのオブジェクトの下にMainCameraをドラッグ&ドロップすれば、・・・これだけでいいんだな!

ただ・・こんな楽な話なのに、次はわざわざカメラのタテを固定するプログラムの作成、FollwCamera.csの作成になる。でも、このFollwCamera.csについては、第79回22分16秒でこのスクリプトの中身を変更してゴールを設定しているんだぜ。この時点では全く想像できない話だがな。だから、とりあえず、このFollwCamera.csは必ず作っておこう。ということだ。

第46回22分22秒から

Create>MonoBehaviour ScriptでFollwCamera.csの作成を開始する。

第46回24分28秒

void Update()のところで

this.gameObject.transform.position = new Vector3(target.position.x,0,-10)

第46回24分38秒で

this.gameObject.transform.positionは、「ゲーム内のカメラ」

target.position.xは「横方向はキャラクターについていく」

0は「縦方向は動かさない」

-10は「ゲーム画面より少し引く」ここはZ軸の指定なので奥行きということだな。でもカメラが手前に移動することにより、写されているゲームの舞台が相対的に奥に見える、という話だ。

上の行にある public Transform target この宣言を忘れずにしておこう。

そうしたら、MainCameraにFollwCamera.csをAddCompornetで加える。

第46回24分44秒では、MainCameraにFollwCamera.csをドラッグ&ドロップで行っているが、同じことだな。

第46回25分06秒で、targetにYokoplayerをドラッグ

実行すると・・・うまくいったぜ。(動画の29分56秒)

穴に落ちたらスタートに戻る

第47回12分31秒から

  • ステージを拡大 ②穴に落ちたらスタートに戻る ③タイトルをつける と、あるが

今から私が話すのは②の穴に落ちたらスタートに戻る、というここだけだ。

早い話、アウトと判定すればシーンの移動で自分のシーンに戻る、という作業を今から行うのだ。まずシーンの移動といえば、何回も行っているので理解されていると思うが、まず

using UnityEngine.SceneManagement;を追加する。手で入力する。

次にシーンの登録、次に命令の入力(Yocoplayer.csの  //アウト から if(rb.linerVerocity < 40){ ・・・・ })。穴とか、床が無いところに落ちて、タテの座標が40よりも下になったら、YokoScrollActionというシーンに飛べ!という記述だ。このYokoScrollActionというシーンは現在実行中で、とぶ先については自分でもかまわない。エラーにならない。飛んだらそのシーンの最初に戻って実行し直すので、自分に飛んだら自分を繰り返している様に見える。ということになるんだな。

第47回20分03秒で、単に“Main”でも現在実行中のシーンに戻るという解説がされているが、第47回14分56秒で、放送中の現在のシーン自体が“Main”であったのが確認できたので、皆さんは原則通り、自分の実行中のシーンを登録して、自分の実行中のシーン名をここに入力してくれだよな。

最後に、どこかの穴にわざと落ちて、スタートに戻るかを確認してください。

2.タイマーとゴールを付ける

それじゃあ、第2部である第78回と第79回の内容、「タイマーとゴールを付ける」の話を、れいむが担当するよ。

それで、「タイマーとゴールを付ける」というタイトルがついているけれども、今から行うのは加速の話だね

第78回22分56秒で、

deltaTime、つまり時間の経過を使って、時間が経過すれば移動幅を増やして加速になる、という内容ですね。

2つ、変数を作って(Accel、Brake宣言は9~10行目)

39から52行まで移動の記述。動画の32分51秒。

いろいろアクセルとブレーキの数字を変更させて調整させています。

試行錯誤した結果、

速度(Move Speed)5

ジャンプ力(Jump Power)25

アクセル(Accel)800

ブレーキ(Brake)140

重力はRigidbody2DのGravity Scaleを5にしたよ。このあたりの数値はプログラミングの環境によっても変わってくるし好みもあるので、今、報告した数値にとらわれずに自由に変更してもいいよ。

それで、移動の性能を納得のいく設定にしたら、次は

第79回20分20秒あたりのタイマーの作成の話に移ります。

まあ、このコーナーでサブタイトルをつけるならば

  • 1.タイマーを作る
  • 2.ゴールを作る

ということになるんでしょうねえ。

1.タイマーを作る

まず、タイマーの表示は文字なので、CanvasからUIでText

その中でCountTime.csというスクリプトを新たに作ります。

カウントする時間の変数名をcountTimeとすると、

CountTime.csの中で

基本的に文字なので、textを使う場合は

2行目 using UnityEngine.UI;を宣言しておくよ。

7行目 public float countTime = 0.0f; と宣言して、ここが実数型で宣言しているところに注目しといてください。

すると、基本的に秒については

countTime += Time.deltaTime;

Time.deltaTimeは基本的に秒なので、この様にあらわすことができます。

「秒」はうまくいった様にみえますが、これでは例えば1分12秒はcountTimeでは72になります。それで「分」を先に考えてから「秒」を整理して考えます。

この場合「分」としての変数minは

min = countTime/60であらわすというのが、基本的な考え方だけれども小林先生が、変数の型も考慮しないといけない。という話もあって、int(整数型)はカッコをつければ強制的に変更できる、ということで

第79回20分50秒

int min = (int)(countTime/60); という記述でうまくいきます。

たとえば計算して2.9になっても整数の2になる、ということですね。

「分」がうまくいくと、

「秒」は、変数をsecという名前にしてcountTimeとminから導くと

int sec = (int)(countTime – min * 60);

次に「ミリ秒」、変数名はmsecとすると、

ミリ秒は10進数なので、1秒以上を削って100倍にしてから整数にする、ということで

int msec = (int)((countTime – min * 60 – sec)*100);

これでうまくいく、と放送されました。

そして第79回21分18秒で、数字を文字変数型に変更するために$を用いて表記する、ということで

timeText.text = $”{min:00}:{sec:00}:{msec:00}”;

という感じでうまくいく、ということなんですねえ。

あとは、TIMEという文字だけの作成を加えたらタイマーは完成だよ。(動画の分秒)

2.ゴールを作る

第79回21分28秒

さて、次にゴールの作成の話になります

GoalObjectという空のオブジェクトの中に「ごーる!」という文字を作って、最初に無効、つまりInspectorのチェックをはずしておいて、条件成立時に有効になる様に設定しておく。

ゴールについては、これ以上複雑なことはしたくない!アウトをY座標の限界突破で判定しているのならゴールも同様に単純にX座標の限界突破の判定でいいじゃん!ということで放送当時(コメントとして28行目に残していますが)とは異なる方法を採用しています。

座標はX座標で200f以降でゴール

SetActive(true);でゴールの条件成立時にGoalObjectを無効から有効に変更することで、ゴールは完成です。

3.チェックポイントをひとつ作る

それでは、第3部である第85回の内容、「チェックポイントをひとつ作る」の話を、B2子が担当します。

まず、本編でも改良がすすんでいるので、カメラをY軸にも対応させるように変更しました。

それでも落下の最後までカメラが追っていくのもあんまりセンスが良くないので、

FollowCamera Y軸追加 変数targetYを追加→さらにY座標は0以上に制限

アウトの制限がどの場所でも40落下したらアウトだったので、マップが広くなったことにより、通常のルート上でもアウトになることが発生しました。その対策として40から100に変更しました。

あと・・・今頃ですが、第78回27分47秒でX軸のサイズを-1にすると画像が反転するというのが紹介されていました。前回「ぴよキャッチ」では

SpriteRenderer.flipX = moveX < 0; を紹介しましたが、X軸のスケールを-1倍にして反転を表示するという別の方法ですね。ゴール判定でわかったことで、本編での_tはtransformからの代入からきていることがわかったので

transform.localScale = new Vector3(-1.1.1)

→うp主のは0.5サイズだったので(-0.5f,0.5f,1f)

*******

第85回11分51秒

本編(onリスト、offリストの追加!)第85回13分8秒

新たにcsを作成。 checkpoint.cs

public List<GameObject> onlist = new List<GameObject>();

このままではエラーになります。重要なのはチラッと見える

using System Collections.Generic;    の追加(記入する)

checkpoint.がchackpoint. Ctrl+Rを2回でファイル名と同じように訂正できる。

弓木さん第85回14分7秒「このために間違えた」

ここは、ファイル名とクラスの名前が一致しなかったらクラスの名前をファイル名にあわせに行くように放送されていますが、unity Ver.6(正確にはMicrosoft Visual Studio)で仕様が変わっている様にみえますね。

Cntrl R+Cntrl Rですと、現在では単なる名称変更のショートカットになっていますね。

それで間違えではないのですが、ここでの話の中心は、「シンボルのファイルの名前を変更する」というのが便利です、ということだったんですね。

要するに、通常に新規作成からはじめるとファイル名とクラスの名前が一致するのですが、ここで、ファイル名も間違っていたなあ、と思ったら、ここにチェックを入れた状態で名称を変更すると、ファイル名も一緒に変更できますよ、ということです。

コピーしたりすると、コピー元の名前のままなので、その時は「シンボルのファイルの名前を変更する」のチェック欄を入れることができません。素直に一致させるように手入力、従来通りの直し方になります。

Onlist版の下にofflist版も書く

第85回14分40秒

今回の独特な変数 tfPlayerとcoliid

後に第85回22分17秒でこの詳細がわかるのですが、ここでは宣言として

tfPlayer //プレイヤーの位置を把握するための変数

coliid   //当たり判定のための変数

第85回14分49秒

checkpoint表示のためのImageを親、子で作る。親が黒、子が白で、子は最初はメインのチェックを外してfalse状態にしておく。

チェックポイントを通って子をトゥルーにすると、白くなる(チェックポイントを通ったしるしとなる)

チェックポイントを通ったしるしの作成(本編ではこのチェックポイントを通ったしるしの詳しい座標の話もされていましたが、うp主さんが第78回14分53秒で小林先生がFull HD1920×1080に変更していたシーンを見逃していたので、この動画では座標が変わります。環境によってかわるので、みなさんのお好きなように配置してください。)

そして第85回16分2秒での親子オブジェクトの配置。(動画の45分48秒)

第85回16分31秒での解説(親を裏の黒にして、子を表の白にして、はじめは子を無効にして親の黒が表示されている。チェックポイントを通過したら子を有効にして白に見えるようにする)

第85回16分43秒 次は、チェックポイントその物を作っていきます。

第85回17分14秒、ここでレイヤーの話が、本編でも登場しましたね!プレハブの壁を複製して、チェックポイントのレイヤーをIgnore Raycastにすることにより、すりぬける。(第85回17分24秒)

しかしもうひとつ重要なことが。チェックポイントにするものは、BoxCollider2DのIs Triggerにチェックをいれとかないとプログラミングに連動しないので、チェックを入れてください!

第85回21分3秒 ここから、onlistを用いてロジックを完成させて))いきます。

第85回21分38秒、If(collid.OverlapPoint(tfPlayer.position))以下の解説。

1つめのチェックポイントの点燈を確認すると、次は、対応する妨害する壁の作成です。

ヒエラルキーでの有効、無効の設定を調整・確認します。チェックポイントの色を変更します。

第85回23分52秒、1つめのチェックポイントの点燈を確認すると、次は、対応する妨害する壁の作成をします。作成すると、その作成したチェックポイントに対応した壁を、オフリストにドラッグすることにより、「チェックポイントをひとつ作る」目標達成です。

4.チェックポイントを3つ作る・・・完成まで

それでは、第4部である第86回の内容、「チェックポイントを3つ作る・・・完成まで」の話を、B子が担当するね。

第86回17分58秒 チェックポイントや壁を複製して2番目や3番目を作りますよ。

第86回18分39秒 複製したままではリストの中は全部1番目のチェックポイントになっているので、これを2番目や3番目に適正に設定し直します。

第86回23分5秒 まず、仕様としては壁は1つ。チェックポイントを3つ取ることで壁が消えるという仕様でした。 なので、壁は3つ重ねる。

第86回23分10秒 あるいは、弓木さんの様にチェックポイントをバラバラにして・・・。お好きな方法をどうぞ。

その後、本編では、乃木坂の皆様の完成版はunityroomで公開するから、放送では非公開となって第86回の番組が終わっていました。

後は、音を追加します。

ここでやりのこしは

1 ステージのブラッシュアップ(Sunの追加も)太陽がデフォルトでMulitipleになっているので自動的に分解されてしまうというハプニングが!Singleにしたら1枚の絵になりました。

2 アウト時に背景が赤くなる→背景を赤くして、水色の大きいオブジェクトをZ軸を考慮して追加すればよいでしょう。

3 音の追加 今回もちっちゃな探検隊 ←いいところまでいったが、音の出ないのがあり、つまづく。毎フレーム実行していたのが聞こえない原因だった。新たにItemsoundというオブジェクトを設けて、そちらにItemsound.csという、これまた毎フレーム実行しないようなプログラミングを書いて解決した。

4 ゴールした後の処理がまだ不十分だったので、手直し。

Escキーを加えようとしたが、今度はタイマーが止まらない。Yokoplayerの方で音やシーン移動を試みたが、ゴールの判定の連携がうまくいかなかったのであきらめた。終了するには近くの穴へ飛び込んで終わらせてください。

完成(動画の52分39秒)

それでは、最後に使用したソースやインスペクターの状態を見てください。お疲れさまでした!

Yokoacplayer.cs

Yokoplayer inspector状態(1)

Yokoplayer inspector状態(2)

Yokoplayer inspector状態(3)

Yokoplayer inspector状態(4)

FollowCamera.cs

MainCamera inspector状態(4)

CountTime.cs

Checkpoint.cs

チェックポイントのひとつ(Wall(Check))(1)

チェックポイントのひとつ(Wall(Check))(2)

チェックポイントのひとつ(Wall(Check))(3)

チェックポイント信号のひとつ(子、白、Image(3))

Itemsound.cs

Itemsound(IItemsoundと綴りが間違っていますが・・・)

以上です。お疲れ様でした。

コメント

タイトルとURLをコピーしました