はじめに
「ゾンビ・ライトセーバー・ファイト」チュートリアルへようこそ!
これから作るゲームのチュートリアルは、総合的なレッスンです。つまり、Roblox Studioを使って様々な側面から新しい知識を学ぶことになります。
1.基本的なライティング(部分点光、環境光)
2.アニメーション(リグ用アニメーションの作成方法、アニメーションを読み込んで再生する方法など)
3.サウンドサービス(音声のアップロード/アップロードされた音声の使用/音声を効果音やBGMとして再生)
4.キル数を記録するスコアボード
5.自動化のためのクローン。 このチュートリアルでは、1つのゾンビを多くの自動生成ゾンビにクローンする方法について説明します。
6.ツール作成。 このチュートリアルでは、ゾンビにダメージを与える剣を作成する方法を学びます。
7.その他多数…
1.基本的なオブジェクト/パーツ(ゲームではどのように見えるか?)
Baseplateのテンプレートを新規に作成します。
まずは、スクリプトに必要な基本パーツの作成から始めます。
基本地形
1.ベースプレートを削除する
2.地形の作成
3.SpawnLocationの位置を変更する
ゾンビオリジンリグ
1.ゾンビのオリジナル(と未来のゾンビ)のためのフォルダを作成します。
2.ゾンビのオリジナルを作成し、Workspace/Zombiesフォルダに移動する。「アバター」->「リグビルダー」で「Block Avater」を選択する。
3.zombieOriginの “HumanoidRootPart “をアンカーしていることを確認してください:
プレイヤーの ライトセーバー
1.ワークスペースにツールを作成します。 ツール内に「Part」を作成し、名前を”Handle”とします(**名前は”Handle”でなければなりません)。
2.”Handle”を選択し、BrickColorとSizeを調整します。
3.”Handle”パーツを複製し、”blade”に改名する。
4.”blade”のカラー変更、マテリアル変更、サイズ変更
5.再配置 (注意:”blade”のパーツはゲーム画面ではなく、エクスプローラーから選んでください!)
6.「WeldConstraint」を ”blade”に追加し、その制約に”blade”と”Handle”を追加します。
WeldConstraintは、2つの部品を手で持ったときに、どちらかの部品を落とすことなく持ち上げることができます。
7.ツールに ”sword”の名前をつける
8.地面から拾い上げられるかテストしてみよう
2.ゲームメカニクス(ゲームはどのように動くのか?)
これらは、ゲームが動作するための最低条件です(映像・音声拡張なし)。
- ゾンビのクローン
- ゾンビが生成され続ける
- ゾンビのHPバーが常に頭頂部に表示される
- ゾンビのクローンを作る場所、頻度
- ゾンビの行動
- ゾンビがプレイヤーに近づいてくる
- ゾンビの速度制御
- HPが0になったらゾンビを消す
- プレイヤーの行動
- ゾンビに触れるとダメージを受ける
- マウスクリックをすると、スイングアニメーションを再生する
- ライトセーバーの動作
- 被弾したゾンビにダメージを与える
まずはゾンビクローンから。
1.ゾンビクローン
主な目的:ゾンビはクローンを作り続ける
ServerScriptServiceの下にスクリプトを作成し、名前を ”server”とします。
サーバースクリプトの中で、次のように入力します。
(game.ServerScriptService.server)
- 1行目:Zombiesフォルダから、先ほど作成した”zombieOrigin”を取得する
- 5~14行目:3秒ごとにゾンビを生成するためのループ
- 6行目:オリジナルをクローンする
- 7行目:クローンしたゾンビモデルを、オリジンと同じフォルダに入れる
- 8行目:クローン化したゾンビの名前を ”zombie”に変更する。
- 9行目:アンカーをfalseに設定して、ゾンビが地面に落ちるようにする
- 10行目:ゾンビのHPバーを常に見えるようにする
- 12~13行目:ゾンビのスポーン位置をランダムに設定する
2.ゾンビの行動
主な目的:ゾンビはプレイヤーを追いかけ続けること
zombieOriginモデルの下にスクリプトを作成し、”zombieControl”と命名する。
zombieControlスクリプトの中で、次のように入力します。
(game.Workspace.Zombies.zombieOrigin.zombieControl)
- 1~4行目:プレイヤー、ゾンビの情報取得
- 6,7,15行目:各ゾンビの速度を5~15の範囲でランダムに設定します。
- 9~13行目:プレイヤーがゲームに参加し、そのキャラクターがセットアップされるまで待機する
- 17~25行目:0.1秒ごとのループ
- 18行目:プレイヤーに向かって移動(17行目の0.1秒に1回の割合で移動)
- 20~24行目:ゾンビのHPが0になった場合、ゾンビを削除する
3.プレイヤーの行動
主な目的:ゾンビに触れるとHPが減少する
StarterPlayer.StarterCharacterScriptsの下に「LocalScript」を作成し、”charControl”という名前をつけます。
(スクリプトとローカルスクリプトの違いについては、チュートリアルの「サーバーとクライアント」をご覧ください!)
”charControl”の中に、次のように入力します。
(game.StarterPlayer.StarterCharacterScripts.charControl)
- 1~3行目:ローカルプレイヤーおよびキャラクター情報の取得
- 4行目:連続でゾンビからダメージを受けることを防ぐためのブール変数(13、14、23行目)
- 6行目:ゾンビが与えるべきダメージの定数
- 8~10行目:プレイヤーとキャラクターがゲームにロードされたかどうかをチェックします。 そうでない場合は、ロードされるまで待つ。
- 12~24行目:ヒットしたオブジェクトからプレイヤーがダメージを受けるかどうかをチェックする関数です。
- 13行目:3つのことをチェックする
- 1.ヒットしたオブジェクトがゾンビの場合
- 2.余計なダメージを与えないために、ロックが外れているかどうかを確認する
- 3.触れたゾンビがまだ生きているかどうか確認する
- 14~15行目:ダメージを受け、さらなるダメージを与えないためロックする。
- 18~21行目:プレイヤーのHPが0の場合、”dead”というメッセージを出力する
- 22~23行目:1秒待って”hit lock”を解除し、ゾンビが再びダメージを与えられるようにする
- 13行目:3つのことをチェックする
- 26行目:何かがプレイヤーに当たった時
- 12行目の「dmgLocalChar」関数を実行します。
- ヒットオブジェクトの情報を “dmgLocalChar “関数に送ります。(12行目の “hit “という名前として)
(GIF)
主な目的2:マウスを左クリックすると、以下のように剣を振る動作ができるようにします。
StarterPlayer.StarterCharacterScriptsの下に 「LocalScript」を作成し、”charMedia”と命名します。
”charMedia”の下にアニメーションを作成し、”atkAnimation”と命名します。
さて、これからキャラクターの最初のアニメーションを作成します。
キャラクターのアニメーションを編集するためのダミーリグを作成しましょう。
”Dummy”を選択し、「アニメーションエディタ」をクリックする
画面のどこかにアニメーションエディタウィンドウがポップアップ表示されるはずです。 アニメーションの名前を”atkAnimation”とし、「作成」をクリックします。
すると、ダミーのボディパーツが選択・編集可能になるのがわかります。
ここでは、リグ(Rig:キャラクターのボディ)のアニメーションを作成する方法について説明します。
アニメーションの優先順位を “動作”に編集する
Robloxサーバーにアニメーションを公開する
次のような画面が表示されます。 ID番号の横にある小さなアイコンをクリック
コピーしたIDを、先ほど作成したアニメーションファイルに貼り付けます
”charMedia”にも、以下のスクリプトを追加します。
(game.StarterPlayer.StarterCharacterScripts.charMedia)
- 1行目:プレイヤーズのサービスを受け取る
- 3~5行目:現在のクライアント(プレイヤー)の人型、剣(プレイヤーが持っている場合)、アニメーションファイルを取得する
- 7行目:アニメーションファイルからプレイヤーのアニメーショントラックを作成する
- 9~14行目:ライトセーバーのスイング機能。
- 10行目:剣を有効にする
- 11~12行目:アニメーショントラックを再生し、トラックが終了するまで待つ
- 13行目:剣を無効にする
- 16行目:剣がアクティブになったら(マウスが左クリックされたら)、9行目で定義された関数 “swing” を実行する
これで、剣を振ることができるはずです
4.ライトセーバーの動作
主な目的:ライトセーバーが触れた時にゾンビにダメージを与える。
swordの下に 「LocalScript」を作成し、”swordControl”という名前を付ける。
”charControl”の中に、次のように入力します。
(game.Warkspace.sword.swordControl)です。
- 1行目:スクリプトの親から剣のツールを取得
- 3行目:プレイヤーが使用しないときは、剣を無効にする
- 4行目:剣のダメージを2に設定
- 6~15行目:”giveDmg”という名前の関数。
- 6行目:剣に当たる部分(ゾンビの手、ゾンビの胴体などでも可)を受け取り、”hit “と命名する。
- 7行目:そのヒットした部品の親(通常はゾンビのモデル)を割り当て、そのモデルに ”zombieModel” という名前を付けます。
- 9~10行目:zombieModelがゾンビかどうかを確認し、剣が有効になっていれば(charMediaのlocalscriptで制御)、ゾンビにダメージを与える
- 11~13行目:剣に触れているゾンビのHPがゼロの場合、”isKilled”という新しい属性に、”true”という値を設定する。
- 17行目:剣の刃が何かに触れたとき、「giveDmg」という名前の関数を実行する(6行目)。
3.ゲームの充実(どうすれば魅力的なゲームになるのか?)
今ゲームをプレイすると、すべてがうまく動くはずなんですが、ちょっとつまらない……。
ゲームにもっと楽しい要素を取り入れよう
- 環境照明
- ゾンビアニメーション(歩行)
- 音声(ライトセーバーのスイング音、ライトセーバーのヒット音、ゾンビのうめき声、BGM)
- 装飾オブジェクト(地形編集、電柱など)
- リーダーボード、ゲーム設定
1.環境照明
”Lighting”の「ClockTime」を使って、ゲームワールドの時間とその明るさを変更することができます。 ”0”は午前0時を意味し、”12”は正午12時を意味します。
今回は「5.5」をつけて、午前5時30分という意味です(もちろん好きな時間を決めてください!)。
2.ゾンビアニメーション
ゾンビを普通の人間のように動かせるようにしよう。
先ほどのダミーモデルを使い、ダミーをクリックで選択し、”アニメーションエディタ”を開きます。
体の一部分のアニメーションを作成する。
a. アニメ化したい部分を選択する
b. 次に、パーツをスタートさせたい位置に移動させます。 このようにタイムラインの最初のキーフレームになります。
c. タイムライン内の青い線をドラッグして次の好きな時間帯に移動し、2つ目のキーフレームを作成します。
d. 「再生」ボタンをクリックして、アニメーションが動作しているかどうかを確認します。
自分だけのゾンビの動きを作ろう! 以下は、動いているゾンビの例です。
先ほど作成したアニメーションと同様に、アニメーションの優先順位を “動作” に変更することを確認します。
そして、それをrobloxに公開する。
(IDは必ずコピーしてください!後でまた使います)
次に、”zombieOrigin”の下にスクリプトを作成し、”zombieAni”と名付ける。”zombieAni”の下に、アニメーションを作成し、”walkAnimation”と名付ける。
”walkAnimation”の”AnimationId”に先ほどコピーしたIDを貼り付けます。
”zombieAni”の中に、次のように入力します。
(game.Workspace.Zombies.zombieOrigin.zombieAni)
- 1行目:先ほど作成した歩行アニメーションを取得する
- 2行目:ヒューマノイドを取得し、4行目でキャラクターにアニメーションを読み込むことができるようにします
- 4行目:アニメーションを読み込む
- 6-8行目:ゾンビのアニメーションを繰り返し行う無限ループ
ゾンビが計画通りに動いているかチェックしよう
3.オーディオ
これから、BGMや効果音をゲームに追加していきましょう
4つの”Sound” を追加する。
”SoundId”の値に、対応するサウンドIDを入力します。
- BGM:10277787329
- Bite:408341537
- Hit:1647165403
- Swing:4374879236
まず、BGMを入れましょう。 ゲームが始まると、BGMが流れます。 (digilab_2と友達でないと音が流れません)
スクリプトを作成し、ServerScriptServiceの下に ”BGM”という名前を付けます。
スクリプトに次のコードを入力します。
(game.Workspace.ServerScriptService.bgm)
- 1行目:サウンドサービスを受け取る
- 2行目:先ほど作成したBGMサウンドファイルを取得する
- 4行目:BGMサウンドファイルの繰り返しを設定する
- 5行目:BGMサウンドを再生する
BGMが聞こえるかどうか、ゲームでテストしてみよう! (digilab_2と友達でないと音が流れません)
次に、StarterPlayer.StarterCharacterScriptsの下にある”charMedia”を開き、以下を追加してください。
(game.StarterPlayer.StarterCharacterScripts.charMedia)
- 2行目:サウンドサービスを受け取る
- 7行目:ライトセーバーのスイング音を出す
- 14行目:マウスの左クリックでスイング音を再生 (19行目)
次に、”swordControl”スクリプトを開き、以下を追加します。
(game.Workspace.sword.swordControl)
- 1行目:サウンドサービスを受け取る
- 3行目:ライトセーバーのヒット音を出す
- 13行目:ライトセーバーがゾンビに当たった時のヒット音を再生(20行目、8~18行目の関数)
また、”charControl”スクリプトを開き、以下の行を追加します。
(game.StarterPlayer.StarterCharacterScripts.charControl)
- 2行目:サウンドサービスを受け取る
- 5行目:ライトセーバーのヒット音を出す
- 17行目:キャラクターがゾンビに噛まれた時に噛まれた音を再生(29行目でパーツが触れたら、15行目でゾンビかどうか確認している)
また、以下のように噛みつかれた音を調整する必要があります(他のサウンドファイルの設定も自由に変更してください)。
すべてがうまくいけば、下のビデオのように音が聞こえてくるはずです。
4.装飾品
ゲームをより魅力的にするために、もっとオブジェクトや装飾が必要です
- ゾンビが生まれる、赤い透明なエリア
- 電柱
- 装飾された床(溶岩&岩場)
1.赤い透明なエリアの作成
2.電柱の作成
まず、「Part」を作成し(名前を”bulb”にする)、その下に「PointLight」オブジェクトを作成します。
「PointLight」を選択して、プロパティを変更します(ご自由にどうぞ!)。
ライトの下にポールを作成し、1つのオブジェクトにまとめます(パーツの移動と調整方法については、前回のレクチャーを確認してください!)。
(両者が固定(アンカー)されていることを確認してください)
そして、この2つのパーツをグループ化し、”lightPole”と名付けましょう。
モデルを使って電柱を複製!
好きな場所にライトを設置しよう
3.床の装飾
地形エディターを使って、地形をデコレーションしよう (以下の動画は例です)
4.微調整
ゲームを完成させる前に、もう少し片付けなければならないことがあります。
1.ダミーを隠す
2.SpawnLocationを隠す(透明にする)。
3.剣をStarterPackに入れ、ゲーム開始後にプレイヤーが持てるようにする
1.ダミーを隠す
ServerStorageの下にダミーを置いて、ゲーム内で隠れるようにします。
2.SpawnLocationを隠す
SpawnLocationは見えないように、透明にする。
そして、何にもぶつからないようにする。
そして、その上のマークを削除する。
3.剣をスタート時のインベントリに入れる
「StarterPack」は、ゲームをスタートする際に、プレイヤーに渡したい道具を置く場所です。
そこで、WorkspaceからStarterPackに剣を移動します。
さて、プレイを始めると、剣がインベントリに入っているのがわかります(キー「1」を押して剣に切り替えます)。
5.発展
以下を修正/追加したい場合は、読み進めてください。
1.ゾンビのキル数と最高得点を記録するスコアボードの追加
2.プレイヤーが死亡した際に全てのゾンビを削除する
3.HP項目の追加(未記載)
1.スコアボードの追加
まず、ServerScriptService.Serverに、次のような新しい行を追加しましょう。
- 1行目:プレイヤーの情報を取得する
- 2行目:変数の定義
- 26行目:プレイヤーがゲームに参加したら、関数 ”onPlayerAdded” を実行する。
- 11~24行目:onPlayerAdded関数を定義しています。
- 12~13行目:「leaderstats」というスコアボードを、フォルダとして作成する
- 15~21行目:スコアボードに、「Kill」と「HS」という名前の2つの数を作成 (16, 20)
- 23行目:プレイヤーのキャラクターが作成されたら、関数 ”onCharacterAdded” を実行する。
- 7~9行目:onCharacterAdded関数を定義しています。
- 8行目:キャラクターがゲームに参加/再参加したときに、「Kill」の値をリセットする
今プレイすると、自分の右上にスコアボードが表示されるはずです。
まだ機能していないはずです。
leaderstatsでキル数を把握しなければいけません。
1.”ReplicatedStorage”の”Events”というフォルダの下に、「remoteEvent」を追加し、名前を”addKill”にします。
2.次に、ServerScriptService.server にも以下の行を追加します。
1行目:”ReplicatedStorage”の ”Events”フォルダを取得する。
- 34行目:サーバーがクライアント(プレイヤー)からイベントを受信したら、setScore 関数を実行する。
- 27~32行目:setScore 関数を定義しています。
- 28行目:killの値に1加算
- 29~31行目:現在のキル数が最高得点より高いかどうかをチェックする。 もしそうなら、最高得点を現在のキル数で置き換える。
3.プレイヤーがゾンビを倒した時のイベント送信設定
”swordControl”に以下を追加します。
(StarterPack.sword.swordControl)
- 1行目:”ReplicatedStorage”の ”Events”フォルダを取得する。
- 16行目:サーバーに ”addKill”イベントを送信します。
これでスコアボードが動作するはずです。
2.ゾンビの残骸を掃除する
”server”スクリプトの中に、ゲーム開始前にゾンビを一掃するために以下を追加します。
(ServerScriptService.server)
- 9行目:プレイヤーのキャラクターが作成されたら、”Zombies”フォルダの中の子をすべて取得する
- 10~14行目:すべての子をループし、”zombie” という名前のものを破壊します。
3.HP回復アイテム
HP回復アイテムを作成し、名前を ”hpOrigin”とします。
”ServerStorage”の中に入れて、ゲームから消える(見えなくなる)ようにします。
次に、ReplicatedStorage.Eventsの下に、”giveHp”という名前の新しい「remoteEvent」を作成します。
”hpOrigin”に戻って、”hpControl”という名前でスクリプトファイルを作成し、次のように入力します。
(game.ServerStorage.hpOrigin.hpControl)
そして、”ServerScriptService”の中に、新しいスクリプト”addHP”を追加して、次のように入力します。
(game.ServerScriptService.addHP)
game.Workspace.Objects の下に、”hps”という名前のフォルダも作成してください(上記の8行目の名前)。
先ほど作成した ”charControl”に、以下を追加します。
(game.StarterPlayer.StarterCharacterScripts.charControl)