2017-02-11 5 views
2

プレイヤーが立っているときにパーツの色を変えたいのですが、スクリプトをパーツの中に置くのではなく、スクリプトを作業スペースに入れてヒューマノイドのようなイベントからそのパーツを識別できますか?Robloxのブロックをプレイヤーが立っているとき、どのようなイベントが発生しますか?

なぜなら、私はタッチイベントに反応する必要があるので、私は各部分に同じスクリプトを入れたくない部分が100個あるからです。

擬似コードは、あなたがスクリプトを置くことができ、

プレイヤーは一部のイベントが が

おかげ

答えて

1

M. Ziegenhornが書いたようにイベントの一部を特定し、一部の色を変更解​​雇触れるかもしれません文字や足に直接。それはこれを達成する "最も簡単な"方法でしょう。

でも機能を各部分に簡単に接続できます。 以下のコードでは、「TouchParts」という名前のワークスペースのモデルをチェックします。このモデルには、タッチ関数を結び付けたい部分が(想定される)含まれています。

この方法は、あなたがタイの一部の感動が足であるかどうかを確認するためにチェックして追加する必要がありますので、一部(複数可)に触れ、あなたの文字で何かが、感動・イベントを発生することを意味し、それをやって
function Touched(self, Hit) 
    if Hit and Hit.Parent and Hit.Parent:FindFirstChildOfClass'Humanoid' then 
    -- We know it's a character (or NPC) since it contains a Humanoid 
    -- Do your stuff here 
    print(Hit.Parent.Name, 'hit the brick', self:GetFullName()) 
    self.BrickColor = BrickColor.new('Bright red') 
    end 
end 

for _, object in pairs(workspace.TouchParts:GetChildren()) do 
    if object:IsA'BasePart' then 
    object.Touched:connect(function(Hit) 
     Touched(object, Hit) 
     end) 
    end 
end 

脚の代わりに各部分に機能をバインドするのは、何かを触れるのではなく、意図した部分に実際に触れるときにだけ機能が呼び出されることです。しかし、接続する部品の量が増えると、トリガされてメモリに格納されるイベントの量も増加します。おそらくあなたが作業している規模では気づかないかもしれませんが、留意する価値があります。

+0

ありがとう、これは素晴らしいRavenshieldです!触れた機能の1つの他の簡単な質問私はプレイヤーにアクセスすることができますが、その機能の中でタッチされた部分自体にどのようにアクセスできますか?たとえば、タッチした部分の色を変更したい場合などです。 – tartangear

+0

ループを使用して新しいスレッドを生成する方が効率的です。 – warspyking

+0

@tartangear関数の周りに少し混在させることができます。タッチされた関数(例:function Touched(Hit、Object))に別のパラメータを追加し、代わりにイベントの無名関数を作成します。そうすれば、私たちはタッチ関数を呼び出してオブジェクトを渡すことができます。 オリジナルの投稿を編集してこれを説明しました。それを見てみましょう。 – Ravenshield

0

私はrobloxで何かをコード化して以来、しばらくしていましたので、私が作った間違いの言い訳をしてください。

local parent = workspace.Model --This is the model that contains all of that parts you are checking. 
local deb = 5 --Simple debounce variable, it's the minimum wait time in between event fires, in seconds. 
local col = BrickColor.new("White") --The color you want to change them to once touched. 

for _,object in next,parent:GetChildren() do --Set up an event for each object 
    if object:IsA("BasePart") then --Make sure it's some sort of part 
     spawn(function() --Create a new thread for the event so that it can run separately and not yield our code 
      while true do --Create infinite loop so event can fire multiple times 
       local hit = object.Touched:wait() --Waits for the object to be touched and assigns what touched it to the variable hit 
       local player = game.Players:GetPlayerFromCharacter(hit.Parent) --Either finds the player, or nil 
       if player then --If it was indeed a player that touched it 
        object.BrickColor = BrickColor.new(col) --Change color; note this is also where any other code that should run on touch should go. 
       end 
       wait(deb) --Wait for debounce 
      end 
     end) 
    end 
end 

これはおそらく、これを行う最も効率的な方法の1つです。

+0

ありがとうwarspyking、私はこれを試してみます。スポーン関数は面白いです - 私はこれについてさらに研究する必要があります! – tartangear

+0

新しいスレッドを生成するだけです。 – warspyking

+0

私はモデルで100の芸術を持っている場合、これは同時に100のスレッドを呼び出すでしょう、これはたくさん走っているのですか? – tartangear

関連する問題