どうも、ロブスタのハルです。
今回からたまにブログっぽい記事を書いて行こうと思います。
ゲーム作りでは他の人が作ったモデルを使うことが多いですよね。
僕も色々な方が作ったモデルにお世話になることが多いんですが、先日困ったことが起きました。
開くはずのドアが開かないッ!!
とある方のドアモデルを使おうとしたんですが、エラーが出るんです。
そのエラーがこんな感じ。
そして、Door1の中身はこんな感じ。
ちなみに階層はこんな感じ。
分かる人が見れば「あー、そういうことね」となるレベルですが、プログラミング経験が少ない初心者の方は何がおかしいの?全部あるじゃんってなるかもしれません。
画面の前のあなたはどこがおかしいか気づきましたか?
…
…
…
正解はProximityPromptのつづりが間違っていることと、オブジェクトの参照が間違っていることです。
今、24行目のエラー箇所は以下のように書かれていますね。
script.Parent.Door1.ProxomityPrompt.Triggered:Connect(OpenDoor)
もう一度エクスプローラーのDoor1の中身を見てみてください。
そのうえで順番に考えていきますよ。
まず、scriptというのはこのスクリプト自身、つまりDoorScriptを指していますね。
次にそのParentなのでDoorScriptの親であるDoor1が得られます。しかし、script.Parent.Door1というのは謎です。なぜならscript.ParentでDoor1を表しているのでDoor1.Door1といった意味になってしまうから。
よって、まずはDoor1というのが要らないですね。
ここまでで以下のようになります。
script.Parent.ProxomityPrompt.Triggered:Connect(OpenDoor)
さて、続きを見てみましょう。
script.Parentの後にはProxomityPromptが来ています。
エクスプローラーを確認してみると…ない!
ProximityPromptというのはありますが、ProxomityPromptというのはありません。
つまり、スペル間違えです。
修正したのが以下になります。
script.Parent.ProximityPrompt.Triggered:Connect(OpenDoor)
さてさて、あとはイベントの接続なので問題なさそうですね。
ここまでの話で何言ってんの?となった方はこちらの記事を読んでみてください。
これで実行できるようになりました。
…なったんですが、警告が出てきました。
”Door1のProximityPromptのScriptの3行目で1行目のfunctionを閉じるためのendを付けてね。”というエラーですね。
探してみるとあったのでこのScriptを開いてみます。
中身はこのようになっていました。
workspace.Part.ProximityPrompt.Triggered:Connect(function(player)
print("The user interacted with me!")
これは確かにfunctionのendもないし、Connectの閉じかっこもないですね…
ということでつけてあげました。
workspace.Part.ProximityPrompt.Triggered:Connect(function(player)
print("The user interacted with me!")
end)
これでいけるやろと思っていたんですがまたまたエラーが。
”ProximityPromptはWorkspace.Partパートの有効なメンバーではない”―つまり、その参照じゃ見つからないよって言っているわけですね。
これの何が問題かって、『workspaceの子であるPartというのが必ずしもこのドア(Door1)を指しているわけではない』ということなんですよね。Partという名前はパーツを生成したときの初期値ですし、被っている可能性もあるわけです。
じゃあどうするか。相対参照を使いましょう。
script.Parent.Triggered:Connect(function(player)
print("The user interacted with me!")
end)
こうすることでこのスクリプト(Script)の親であるProximityPromptに対してイベントを接続することができるようになります。
もし、これじゃあ何に対してトリガーを付けているかわからないよという方は一旦変数に格納してもいいですね。
local proximityPrompt = script.Parent
proximityPrompt.Triggered:Connect(function(player)
print("The user interacted with me!")
end)
これでようやくエラーがなくなりました。
初心者向けのエラーが多すぎてわざとなのかと疑ってしまいました…
開くはずのドアが開かないッ!!
…これは僕の環境が悪いのかな?
コメント