イベントというものを理解しましょう。最初のイベントは「タッチイベント」というもので、プレイヤーがパーツに触れると発生するものです。
登場する英単語
英単語 | 読み方 | |
---|---|---|
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)
11 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つ分けて考え、シンプルなコードを作るように心がけてください。
分かりました。もう一回やり直してみます!
教えてください!関数なのか、オブジェクトなのかの判断する方法はありますか?
自動車に例えると、オブジェクトは車そのもの、関数はその車を操作するもの、例えば「速度を上げろ」とか「止まれ」とかになります。
オブジェクトは「物体」、関数は「機能」です。
2023年10月18日に投稿したプログラムを分類してみます。
【オブジェクト】
part、humanoid、connect
【関数】
onTouch、FindFirstChild、Disconnect、TakeDamage、wait
connectもオブジェクトなのがびっくりです。
よく、connect:(function(hit)
end)とありますが、このconnectがオブジェクトなんですね!
何か混同しない方法はありますか?
もう1つ質問お願いします。
TouchedとonTouchedの違いについてです。
Touchedは関数なのに()がない。しかもpartの次にドットでつながっている。
onTouchedはfunctionで作った関数ですね。
functionでonTouched()と関数を作って後に、
なぜあとから、オブジェクト.Touched:connect(onTouched)というスクリプトになるのですか?
よろしくお願いします
少々違います。
connect:Disconnect()
としていますね。ここのconnectがオブジェクトで、Disconnect()がメソッド(関数)になります。
※オブジェクトに付属する関数のことをメソッドという呼ぶ場合があります。
connect = part.Touched:Connect(onTouch)
で、オブジェクトを代入しています。
———————————–
part.Touched:Connect(function(hit)
end)
Touchedは「イベント」というもので、それに接続するという機能としてConnectがあります。(機能なので関数に分類)
Connectのパラメータで関数を指定しますが、関数名を指定する他、上記のように関数そのものを入れることができます。
Partにあらかじめ装備されているイベントはToched 以外にありますか?
ドットでつながっているのでわかりにくいのですが、イベントなのか、階層の指定なのかわかる方法はありますか?
Partのイベントは、Toched と TouchEnded の2つです。
TouchEnded は、パーツが別のパーツに接触しなくなったときに発生します。
階層は、エクスプローラで確認すると分かります。
Part の仕様は以下のページに掲載されていますのでそちらを参照してください。
https://create.roblox.com/docs/ja-jp/reference/engine/classes/Part