第18回 ~タッチイベント Touched~

イベントというものを理解しましょう。最初のイベントは「タッチイベント」というもので、プレイヤーがパーツに触れると発生するものです。

登場する英単語

英単語読み方
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~”
    1. 方法はいくつかあると思いますが、次のようなプログラムで実現可能でしょう。

      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. 一度にたくさんのことを行おうとするとプログラムが複雑になり、自身でも想定しないような動作になります。
      1つ1つ分けて考え、シンプルなコードを作るように心がけてください。

    1. 自動車に例えると、オブジェクトは車そのもの、関数はその車を操作するもの、例えば「速度を上げろ」とか「止まれ」とかになります。
      オブジェクトは「物体」、関数は「機能」です。
      2023年10月18日に投稿したプログラムを分類してみます。
      【オブジェクト】
      part、humanoid、connect
      【関数】
      onTouch、FindFirstChild、Disconnect、TakeDamage、wait

      1. connectもオブジェクトなのがびっくりです。
        よく、connect:(function(hit)
        end)とありますが、このconnectがオブジェクトなんですね!
        何か混同しない方法はありますか?
        もう1つ質問お願いします。
        TouchedとonTouchedの違いについてです。
        Touchedは関数なのに()がない。しかもpartの次にドットでつながっている。
        onTouchedはfunctionで作った関数ですね。
        functionでonTouched()と関数を作って後に、
        なぜあとから、オブジェクト.Touched:connect(onTouched)というスクリプトになるのですか?
        よろしくお願いします

        1. 少々違います。
          connect:Disconnect()
          としていますね。ここのconnectがオブジェクトで、Disconnect()がメソッド(関数)になります。
          ※オブジェクトに付属する関数のことをメソッドという呼ぶ場合があります。
          connect = part.Touched:Connect(onTouch)
          で、オブジェクトを代入しています。
          ———————————–
          part.Touched:Connect(function(hit)
          end)
          Touchedは「イベント」というもので、それに接続するという機能としてConnectがあります。(機能なので関数に分類)
          Connectのパラメータで関数を指定しますが、関数名を指定する他、上記のように関数そのものを入れることができます。

  2. Partにあらかじめ装備されているイベントはToched 以外にありますか?
    ドットでつながっているのでわかりにくいのですが、イベントなのか、階層の指定なのかわかる方法はありますか?

コメントを残す