#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の半分の長さを取得するのに、負の値を掛け、半分に割ることで中点を取得し格納するという役目をしています。 レーザービームのプロパティーをセットします。LaserPartをInstanceで作成した後に、サイズ、色、マテリアル等が設定されています。そして最後に、パーツをDebrisサービスに追加することで、(デブリは瓦礫ということですから)それをSHOT_DURATION変数の秒数の後にレーザービームが削除されるようにします。 これで、レーザービームをレンダリングする関数が完成しましたので、ここから、ToolControllerにいって、この関数をToolControllerから呼び出すことをしていきます。 ToolControllerスクリプトの上部で、LaserRendererという名前の変数を宣言します。 fireWeapon関数の下部でLaserRenderer関数を呼び出します。 再生ボタンをクリックして武器をテストします。ツールがアクティブになると、武器とマウスの間にレーザービームが見えるはずです。 ここまでできたらほぼ出来上がっています。今日の内容のコードはこちらを参考にしました。コードをコピペされる場合はこちらをクリックして下さいね。 武器のコントールのコードについては動画には載せていませんが、プレイヤーが短時間で多くのダメージを敵に対して与えるのを防ぐために、各ショットの間に遅延を用いて、クリックの速度に関係なく、各ショットの間に短い遅れをとるゲームのコントロールをすると促しています。これはRobloxで自分のゲームを作成される時にこういった細かいところで制御する方法が大切だということでしょう。 Robloxのサイトは、素晴らしい知識と探求の楽しみがいっぱいですね。皆さんはいかがでしか。本日は有難うございました。 良いコードの書き方というのは新しい機能を追加しても、エラーが出ない優れたロジックから成り立っているものだと思います。もちろんそれをする為には常にコードの書き方が一致した内容でコードが書かれてないと読み難い、結果、理解もできないとなりますよね。RobloxのDeveloperサイトでは、その様な書き方を正しくちゃんとしています。それによって、慣れてきたときには既に素晴らしロジックを身についているでしょう。 シリーズの動画 #64:Roblox ゲーム内で使用する銃の作り方 #65:Roblox ゲーム内で使用する銃の効果音のスクリプト #66:衝突を見つけるためのレイキャスティング #67:レイキャストが武器を発射:プレイヤーと誤って衝突しないようにする その他参考にしたサイト Weapons Kit NPC Kit CFrameを理解する Object and World Space
Author Archives: Sonomi
ゲーム色が変わるコード
Lua言語は、RobloxやCoreのゲームクリエーションプラットホームに使用されています。少しずつでも、コードに慣れていくのが目的で、このTargetのコマンドを紹介しようと思いました。マウスをクリックする度に、プレイトの反応をみて下さい。Robloxのゲームを作成するときに、こんな面白いことが起きてもいいのではないかと思うかもしれません。 さて、Robloxスタジオは開きましたか? カラーランダマイザーツール・Color Randomizer Tool プレーヤーのバックパックに、次のコードサンプルを配置するとStarterPlayerScriptsと、ツールが作成されます。このツールを装備すると、プレーヤーがBasePartをクリックするたびにBasePart.BrickColorツールが変更されます。 では、これをスタジオで実行して見てください。 ホットバー、Toolが表示されますね。Toolをクリックし、ベースをクリックすると、あらあら不思議?色がどんどん変化しますね。 ここで注目するのは? 7行目:ToolのHandleがFalseに設定されています。 実際にStarterPackにツールを作って、Handleオブジェを入れた状態でこのプログラムが実行できるかどうか、考えてみてね。
Student projects Ichiban
描いた言葉は「日本一」 これはRaspberryPiとSenseHATを学習した際に、生徒が次の方法を自主学習され、出来上がった作品のリンク先を送ってくれたものをスライドショーにしました。 Pythonを使用してSenseHATと通信する SenseHATの出力にアクセスする SenseHATの入力をプログラムする SenseHATライブラリを使用してメッセージと画像を表示する 変数を使用してセンサーデータを保存する ループを使用して動作を繰り返す スライドショーの矢印をクリックすると「日本一」が出できます。 プログラムを難しいと思わないで、挑戦と失敗を良い経験と思って取り組んでくださっている親御さんのお子様に対するご姿勢と優しく応援する言葉は、私も学びたいと思っています。いつもありがとうございます。
Pythonプログラム
Pythonプログラムで3つの数字の中から最大のものを見つける このプログラムでは、if elseを使用して、3つの数値の中から最大のものを見つけて表示する方法を学習します。 この例を理解するには、次のPythonプログラミングトピックの知識とユーモアのセンスと想像力が必要です。 Python if … elseステートメント Pythonの入力、出力、インポート 数字で比べるのが得意でない場合は、食べ物やコップにそそぐジュースの量で、一番大きいものや、一番量の多いいものを見つけるときは、どうしたらいいかを考えてもいいですよ。 想像できましたか。 では、このプログラムでは、if elseを使用して、3つの数値の中から最大のものを見つけて表示する方法を学習します。 上記のプログラムでは、3つの数字がnum1、num2そしてnum3それぞれ格納されています。 次に、if…elif…elseのはしごを使用して、3つの中で最大のものを見つけて表示します。 3つの数字を比べる方法は、>= の演算子を使って考えます。 例えば、num1、num2、num3を1、4、2とし、順番に数字を比べると。。。この様になりませんか。最初にnum1をnum2、num3と比べますから、 もし (1 >= 4) と (1 >= 2)とした時、この比較は正しいですか?と考えます。でも、答えは、No!です。ですから、次にnum2をnum1、num3と比べます。もし (4 >= 1) と (4 >= 2)とした時、この比較は正しいですか?と考えます。答えは、Yes!です。 となりますのでプログラムはここでステートメントを抜けて、答えを出力します。 ここでは最後の数字を比べる必要はないですね。 では、次のページに完成したプログラムがありますので見てみましょう。
RemoteEvents:Client to Server 2
ゲーム内で武器を使って相手を攻撃する方法 Robloxフォーラムから Robloxのフォーラムサイトでも話題を呼んだ「The weapon does not kill the player」の投稿は、Roblox開発者がゲーム開発を始めると、最初に気がつく問題ではないのでしょうか。今回は、リモートイベントの仕組みを考える良い機会です。難しいようにみえても、意外と簡単だったということもありますので、コードがうまく走らないで悩んでいるのは自分だけではないと、仲間をみつけた気分で読み進めて下さい。また、このフォーラムサイトは、経験豊富なRobloxのプログラマーが親身になって問題を解決に導きます。もしご興味がある方は覗いて見て下さい。何かを得れる可能性が高いと思います。 何が起きているのでしょうか。 ローカルプレーヤーとサーバー側が繋がっていないので、ゲームを公開しても相手のプレイヤーを武器で倒せないということが生じています。せっかくゲームを作ってもこれでは悲しいですよね。ですが、この解決策として、上のフォーラムサイトでも、FireSeverメソッド を使うようにと促しています。こうなると早速、Remote Eventを学習することにつきます。 *下記の動画:「#63ゲーム内で武器を使って相手を攻撃する方法」にて詳しく例を使って述べています。 ですので、ここでは、簡単にFireSever()メソッドのみ焦点を当てて、剣で相手に攻撃を与えるコードの構造に少し触れていきましょう。 “Oof”をするコード VS FireServer()を使うコード 下のイメージでは、ローカルプレーヤーのクライアントレベルから、サーバレベルに接続できるコードを赤線で引いて、上下に並べて比べ易くしました。上の「Oof」をするコード、LocalScriptLocalの11行目に注目して下さい。ここでは、アバターがパーツに触れるとアバターの健康、ヘルスをゼロに設定することで、アバターがダメージを受けたことが分かりますが、一方、下のコード、LocalScripteSeverでは、最初の2行のコードで、RemoteEventインスタンスをポイントし、次の13行目のFireServer()メソッドでイベントを発生させ、サーバに接続しています。そして、その他のコードについては、変数名を除いては、コードの構成は変更してない事がわかります。 ファイアー!! ServerScriptService内に、Scriptを作成したら、その内のコードで、RemoteEventインスタンスをポイントし、関数をOnServerEventに接続します。アバターのヘルスをゼロに設定するコードの代わりに、ここでリモートイベントを使用して、TakeDamageの関数にてダメージが100に到達するまでイベントを生じることをしています。この関数は、剣が相手のプレーヤーに触れる度に呼ばれ、相手がダメージを受けている処理を行ってくれます。そしてそれは、サーバー上のすべてのユーザーがその変更を知ることができるようになっています。 動画では、「Roblox Studio」 にて武器を作って相手に攻撃をしダメージを与える一連のコードの構成をまとめましたので、どうぞご参考にされて下さい。 動画も含め、以上の内容が理解できると、ゲーム開発の第一突破口となればと願います!
RemoteEvents:Client to Server
Level : Robloxのレッスン1〜4を終了したレベル 今回は、Robloxのリモートイベントを使用し、クライアントからサーバーに通信する方法を学習していきましょう。これはRobloxでのマルチプレイヤーゲームの一般的な機能を理解できるコードの書き方になります。 リモートイベントというのは、クライアントー>サーバーに通信するとき使用します。サーバーはインターネットで繋がっている大きな強力なRobloxコンピューターで、クライアントは、パーソナルコンピューター、携帯、タブレット、またはゲームコンソールです。 クライアントが、サーバーと通信するには、リモートイベントとリモートファンクションの2つのリモートのどちらかを使用します。 リモートイベントは、one-way communicationというデザインがなされていて、リモートファンクションはtwo-way communicationというデザインで構成されています。 リモートイベントには4つの使用方法があって、それぞれ情報の送信の仕方が目的によって異なります。 今回は、リモートイベントのクライアント→サーバーの通信方法を使用していきます。 この方法は、例えば、ユーザーがロブロックスのゲームを実行し、キーボードの ” e ” を押した時、新しく作成されたパーツがサーバー上のすべてのユーザーの画面に表示されるようになります。 その他のリモートイベントとリモートファンクションの使用方法は、…今のところは、リンク先からご参考にされて下さい。 下記リンク先のステップは、Robloxスタジオのインターフェイスを学習します。なんでも最初は真似してみましょう。このステップをやってプログラムが上手く走ると、サーバーと通信してパーツを表示することができます。 Robloxのサイト:Remote Functions and Events Using Remote Events(2ステップ) Client toSeverを行って下さい。(3ステップ) 上記の内容のステップができたら、実際にパーツが作成されるかどうかテストをしましょう。
Python「正多角形」プロジェクト
Level:初心者(PythonのBasicsのレッスン1と2が終了したレベルです) 前書き このプロジェクトでは、「辺の長さが全て等しく,角の大きさも全て等しい」という正多角形の性質を使って図形を描きます。このプログラムは、一連の動きを特定の回数だけ実行し図形を描く方法を考えます。さらに再利用可能な一連の操作は、色々な図形に活用できる様にプログラムを構成していきます。 ルール:コンピューターは、何角形の図形を描きたいかを聞きます。次に、その図形の一辺の長さを聞きます。一辺の長さはピクセルで表します。 ここをクリックすると正多角形(正方形、正三角形、正六角形等)が描けます。 1. 1つ目の質問 このTrinketを開きます。:https://bit.ly/3pW12yJ コード1行目にこのプロジェクトで使用する亀のモジュールがすでにインポートされています。 import turtle 3行目は、printステートメントでプログラムの目的を表示します。 print(‘亀が図形を描きます。’) 4行目は、プレーヤーに図形の辺の数値を入力してもらいます。変数名のsideは、英語で一辺のことを表します。プレーヤーが入力した数字を変数に保持しています。 では、ここからTrinketの Remixボタン を押して、登録アカウントを作成、書いたコードをセーブしていきましょう。Remixしないと保存できませんが、コードを書くことはできます。 次にプレーヤーが整数以外の数字を入力した場合のために、intを使い全ての入力が整数になるようにします。 side = int(side) クイズ!プレーヤーが入力した数字を出力するにはどうしますか。 print(‘side’) print(side) print() 答えはこちらです。 2番のprint(side)でした!プログラムにコードを書いて、数字が出力されるか試して下さいね。
Pythonレッスン
学習を開始する準備はできましたか? Pythonコードは、コード初心者でもわかりやすく、直ぐに理解することができます。例えば下のコードですが、この内容を習う過程でいつくかの数学的かつ創造的な要素を学習することになります。 図形を描くための「辺の数」と「回す角度」ルール タートルモジュール 入力と出力の方法 変数と関数 ループ等 このプログラムを実行すると図形が描けます。先ずは、実際に数字を入れて図形を描いてみて下さい。下のリンク先からどうぞ。 亀が図形を描きます。 (3、4、5。。。角形等) あなたの亀は、図形を上手く描くことができましたか? コードの学習内容は、数学の様に論理で考え、コードが爆速でわかる様に、展開の順序を考えます。 良い質問です! 高校生くらいの学習者になると、例えば、11行目の割り算について質問をするかもしれません。 s = 360 / side この内容はさらにプログラムを学習したい生徒が習うことになりますが、 s = 360 / side のsideを0にして、360を0で割ることができないのは何故ですか?と、数学的にどうして0で割ってはいけないのかを質問されるかもしれません。その内容については、こちらの内容を参考にされて下さい。そして、Pythonに限らず大抵のハイ-レベル言語(HLL)の場合、Exceptionsというオブジェクトを学習することで、この問題を改善することを可能にしてくれることを発見します。 コードを実際に体験した子供は、理論に従ってコードを書き直すことに興味が湧き、デバッグというプロセスをしながら解決策を自分で見つけ出す練習をします。時に、エラーに対し「プログラムが文句を言っています」と、ユーモア溢れる言葉で私を笑わせてくれますが、しかしそれは、本当にその通りですね。 このPythonコードは私のレッスンの一つの例ですが、この様なプロセスはPythonの面白さを発見する良いヒントが詰まっています。Exceptionsに到達するまでにたくさんの学習内容、プロジェクトをこなしていきますが、これができる様になると、今度はオブジェクト–指向プログラミング(OOP)を学習することができる様になると思います。
今だからできるゲーム公開の薦め
2014年、当時11歳だった青年がRobloxのLua言語のコード学習を始めてから、ゲームクリエイターとして大成功をする現在に至るまでの話を聞くと、そんなチャンスが巡って来るのはまるで夢話のように聞こえますが、そんな立派なクリエイターでも、始めて公開した7年前のゲームはどんなものだったか想像できますか。 子供が「ゲームを作りたいから」という理由でコード学習を始める気持ちは些細な事、と思うかもしれませんが、ゲームが完成し、いざ共有するとなると誰もが躊躇います。ゲーム公開という行為は、実は、今の親の世代にはなかったことですから、想像するのが難しいと思いますが、その行為は、かなりの情熱と勇気がなければできない事と知って下さい。それは、ゲームの公開に至るまでに費やした時間と労力です。作業をする工程で、楽しくするにはどうしたら良いかをひたすら考え、工夫したり、わからない問題の壁に当たれば、自分で答えを探す方法を学ばなくてはいけません。 先日、一人の生徒が、自分のゲームを公開したよ!と教えてくました。学校の勉強とお稽古事の忙しい合間に作業をしていた事は知っていましたが、本当に公開できた事への喜びと、そして、その結果は想定できたので、ちょっとドッキとしながら、様子を伺いました。案の定、ゲームに誰もアクセスしてくれないと嘆いていました。でも嘆きながらも、「次のゲームの案」を考えている様子に、そのめげない姿は、冒頭に触れた大成功をおさめたゲームクリエイターの話を思い出させ、なんて頼もしいと胸を撫で下ろしました。 ところで、その有名なゲームクリエイター、とあるSNS上にて、最初に公開したゲームについて語っていたのを観た事があるのですが、今でもRobloxのゲームの山の中に埋もれていて「恥ずかしい」と言いながら、笑っていたのが印象的でした。 ゲーム作成は、自分のアイディアで、どうしたら人が喜んでくれるか、楽しいと思ってくれるかと考えて、そして共有するに至るのですから、そんな若いクリエイター達は思いやりがあると思います。そして、ゲームを公開する事は、今だからできる、今の世代にあった挑戦の仕方だと思っています。そんな勇敢な未来のクリエイターが集まる場を利用しない手はないと思いませんか。 コーディングを習う機会があれば、是非、今だからできるゲームの公開をお薦めしたいと思いますし、もし公開されたならば、その勇気を讃えて誉めてあげれると、もっとコーディングが好きになると思います。
何を期待しますか?
こんにちは。今年も夏休みのコーディングクラスを開催します。 今年の夏の学習言語 Python言語(対象年齢8歳〜) Lua言語(Roblox)(対象年齢8歳〜) となっています。あれ?少ないと思ったかもしれませんね。笑はい、でも プログラムは、広く浅くやるよりも、一つの言語を狭く深く学ぶと、一つ言語を制覇することができた上に、結果、その他の言語も容易に学べると言うメリットがあります。 なので2つの言語のみ。では早速、Roblox のクラスからご紹介します!←ドキドキ! 今年のレッスンは?この夏のテーマは特撮です!Roblox特殊効果は、世界を美しく見せるだけでなく、体験に命を吹き込み、ユーザーのアクセシビリティを向上させると言うことで、Robloxの会社が推薦をするワクワクするレッスンです。Roblox Studio の経験がほとんど、又はまったくない初心者向けと、ツールにすでに慣れている人向けの 2 つのレッスンとスキルを レベル別にご用意しています。 次にご紹介します Pythonは、世界でも人気のあるプログラミング言語の Python を ゼロから学び、理解するコースです。Python の構文と機能を使った基本的な学習要素から始まり、クイズで理解を確認して次に進みます。←楽しいよ! 学習方法 見ているだけでは泳ぎは上達しないです。コーディングも例外ではありません。Trinketのブラウザー内のライブ コード環境で学びながら、わからない所は、直ぐにお答えできます。コードに慣れて、できる様になるとスキルをテストしてみたくなります。ミニテストにパスして、修了証書を受け取って下さい。きっと誇示することができますよ。ご自分の成長を祝して乾杯です。 このエキサイティングなクラスについては、今後さらに最新情報をお届けできると思います。