イベントというものを理解しましょう。最初のイベントは「タッチイベント」というもので、プレイヤーがパーツに触れると発生するものです。
登場する英単語
英単語 | 読み方 | |
---|---|---|
Touched | タッチド | 別のパーツに触れたら発生するイベント接続用オブジェクト |
Connect | コネクト | イベントを接続する Touchedの関数 |
Humanoid | ヒューマノイド | オブジェクト |
Health | ヘルス | Humanoidのプロパティ、体力値、これを0にすると絶命 |
RightFoot | ライトフット | 「右足」 Humanoidの1パーツ |
LeftFoot | レフトフット | 「左足」 Humanoidの1パーツ |
LeftLowerLeg | レフトロウレグ | 「左下腿」 Humanoidの1パーツ |
RightLowerLeg | ライトロウレグ | 「右下腿」 Humanoidの1パーツ |
FindFirstChildWhichIsA | ファインド・ファースト・チャイルド・フィッチイズエー | 指定したクラスを子供の中から探す |
チェックポイント
- 「イベント」とは「出来事」のこと
- 「タッチイベント」とは「触れた」という出来事を伝える仕組み
- 「Touched」とはPartに装備されているイベント
- Partオブジェクトには、プロパティ(Properties)、関数(Functions)、イベント(Events)の3つがある
- イベントを実行するには、TouchedのConnect関数を使ってイベント処理を接続する
local function onTouch(hit)
print(hit.Name)
end
script.Parent.Touched:Connect(onTouch)
- タッチイベントのパラメーターには触れたオブジェクトが渡される
- プレイヤーがパーツに触れるというのは、キャラクターの足などのパーツが触ったということ
- 足のパーツの親はキャラクターの「Model」
- プレイヤーモデルの場合、Model内に「Humanoid」オブジェクトがある
- Model内にHumanoidオブジェクトがあるかどうかを探す
- Humanoidが見つかったら、プロパティ「Health」に0を代入するとキャラクターが絶命
local function onTouch(hit)
local character = hit.Parent
local humanoid = character:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
script.Parent.Touched:Connect(onTouch)
- 「FindFirstChild」は子供の中から指定した名前のオブジェクトを見つける関数
- 「FindFirstChildWhichIsA」は子供の中から指定したクラスのオブジェクトを見つける関数
- キャラクターのHumanoidを探す場合は「FindFirstChildWhichIsA」がベスト
local function onTouch(hit)
local character = hit.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
script.Parent.Touched:Connect(onTouch)
- パラメーター内に直接、関数の本体を記述することができる
- 「function( ) ~ end」で記述する
script.Parent.Touched:Connect(function(hit)
local character = hit.Parent
local humanoid = character:FindFirstChildWhichIsA("Humanoid")
if humanoid then
humanoid.Health = 0
end
end)
5 thoughts on “第18回 ~タッチイベント Touched~”
コメントを残す
コメントを投稿するにはログインしてください。
ブロックに乗っている間継続的にダメージを食らうコードを教えてください
方法はいくつかあると思いますが、次のようなプログラムで実現可能でしょう。
local part = script.Parent
local function onTouch(hit)
local humanoid = hit.Parent:FindFirstChild(“Humanoid”)
if humanoid then
connect:Disconnect()
humanoid:TakeDamage(5)
wait(1)
connect = part.Touched:Connect(onTouch)
end
end
connect = part.Touched:Connect(onTouch)
すみません。質問です。僕はブロックに触れたら、急にブロックの色が真っ黒になり、そしてだんだん色が明るくなって最終的に赤色になったりしたり、それの同時にブロックが移動したり、隕石が降ったりするシステムを作ろうとしてるだけど、作ってみたら移動がたくさんあったり、色が急に黒になったり、赤になったりチカチカしていました。どうすればいいでしょうか?
一度にたくさんのことを行おうとするとプログラムが複雑になり、自身でも想定しないような動作になります。
1つ1つ分けて考え、シンプルなコードを作るように心がけてください。
分かりました。もう一回やり直してみます!