レーザービームのレンダリング

#68 CFrame()を使ったポジションと方向の割出し

こんにちは。前回の動画 (#67) で銃を作成しました。今日はその銃からビームを出す方法を話していきたいと思います。今現在の状態の説明をしますと、マウスでターゲットとする敵を一回クリックするとアウトプットに「相手をヒットしました」と表示される状態になっています。なので今日は、この銃からレーザービームを発射ができるCFrameについて触れていきましょう。もちろん銃の連射というのもコードを追加することで可能です。でもここでは、一回のクリックで一回のビームがでる方法を学びます。

先ず ModuleScript を使用します。モジュールスクリプトの中で書いたコードは、どこでも使用できますが、この関数のコピーを複数持つことは、その動作を変更する必要があるときに大変なことがあるので、したがって、ModuleScriptsで関数は、ScriptsとLocalScriptsでModuleScriptsを呼び出すrequireが必要とあります。

フォルダーのStarterPlayerの下のStarterPlayerScriptsの中にこれを作成し、名前をLaserRendererと変更して、で、その中にSHOT_DURATIONという名前の変数を宣言していきます。Durationというのは期間という意味ですから、これはレーザーが見える時間(秒単位)を指定したということだと想像できますね。関数を作成しますが、モジュールスクリプトで書く関数の書き方はモジュールスクリプトの名前、その後にドットで単語を続けてそして関数の名前となります。この関数の中で、銃の引き金を引いてビームを発射するビームを作るという訳です。

プレイヤーの持つレーザーブラスターの位置toolHandleで取得して、toolHandle をドットでPositionの単語と繋げてstartPositionという名前の変数を宣言します。

LaserDistanceという名前の変数を宣言して、ここでパラーメータの引数のendPositionからstartPositionの2つの値のベクトルの差を求めます。これにMagnitudeプロパティを使用して、レーザービームの長さ(大きさ)を取得します。

さて、今回の注目点は、laserCFrameという変数を宣言した後に、CFrame.lookAtのコンストラクターを使用しています。コンストラクターはビームを発射させるためにコンピューターに手続きをすると考えてください。ここでの手続きの内容は、レーザービームの位置、そしてレーザービームの方向を決めています。

Robloxゲームの世界では、位置(0、0、0)はゲームの中心にあります。「正面」方向は常に負のZ方向であり、「右」方向は常に正のX方向です。パーツのPositionプロパティは、常にワールドスペースでの位置を参照し、絶対位置とも呼ばれます。

コード内の位置データを操作する場合、最初に位置と方向を最初にワールド空間に変換すると非常に便利です。今後遭遇する幾何学の問題を解決するための基礎としてそれを使用してください!

lookAtのZ軸をlaserDistanceの半分の長さを取得するのに、負の値を掛け、半分に割ることで中点を取得し格納するという役目をしています。

local laserCFrame = CFrame.lookAt(startPosition, endPosition) * CFrame.new(0, 0, -laserDistance / 2)

レーザービームのプロパティーをセットします。LaserPartをInstanceで作成した後に、サイズ、色、マテリアル等が設定されています。そして最後に、パーツをDebrisサービスに追加することで、(デブリは瓦礫ということですから)それをSHOT_DURATION変数の秒数の後にレーザービームが削除されるようにします。


これで、レーザービームをレンダリングする関数が完成しましたので、ここから、ToolControllerにいって、この関数をToolControllerから呼び出すことをしていきます。

  1. ToolControllerスクリプトの上部で、LaserRendererという名前の変数を宣言します。
  2. fireWeapon関数の下部でLaserRenderer関数を呼び出します。
  3. 再生ボタンをクリックして武器をテストします。ツールがアクティブになると、武器とマウスの間にレーザービームが見えるはずです。

ここまでできたらほぼ出来上がっています。今日の内容のコードはこちらを参考にしました。コードをコピペされる場合はこちらをクリックして下さいね。

武器のコントールのコードについては動画には載せていませんが、プレイヤーが短時間で多くのダメージを敵に対して与えるのを防ぐために、各ショットの間に遅延を用いて、クリックの速度に関係なく、各ショットの間に短い遅れをとるゲームのコントロールをすると促しています。これはRobloxで自分のゲームを作成される時にこういった細かいところで制御する方法が大切だということでしょう。

Robloxのサイトは、素晴らしい知識と探求の楽しみがいっぱいですね。皆さんはいかがでしか。本日は有難うございました。

良いコードの書き方というのは新しい機能を追加しても、エラーが出ない優れたロジックから成り立っているものだと思います。もちろんそれをする為には常にコードの書き方が一致した内容でコードが書かれてないと読み難い、結果、理解もできないとなりますよね。RobloxのDeveloperサイトでは、その様な書き方を正しくちゃんとしています。それによって、慣れてきたときには既に素晴らしロジックを身についているでしょう。

シリーズの動画

その他参考にしたサイト

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。