roblox中文社区

 找回密码
 创建账号
搜索
热搜: 活动 交友 discuz
查看: 2135|回复: 5

【官网搬运】【翻译】检测Part的Touch事件:点燃和扑灭火焰

[复制链接]

3

主题

14

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2018-5-9 10:17:28 | 显示全部楼层 |阅读模式
Scripting5_Final.png

在本教程中,我们将学习如何使用事件和功能在游戏中创建一块可以点燃玩家使其着火的Part,以及一块用来灭火的Part
·2楼 创建Part
·3楼 点火!
·4楼 灭火!
·5楼 更进一步

Waaaaaaagh!
回复

使用道具 举报

3

主题

14

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2018-5-9 10:19:21 | 显示全部楼层
创建Part
首先要做的是新建两个Part。其中一个Part将用于点燃玩家,另一个Part将用来灭火。在Explorer中,确保这两个Part的命名是独一无二的,一个命名为FirePart,另一个命名为WaterPart。

Scripting5_Parts.png

我们还需要在ServerScriptService上创建一个Script。右键单击ServerScriptService,将鼠标悬停在Insert Object,然后选择Script。

Waaaaaaagh!
回复

使用道具 举报

3

主题

14

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2018-5-9 10:31:21 | 显示全部楼层
本帖最后由 麦天天天天天 于 2018-5-9 10:34 编辑

点火!
首先,我们需要定义一个函数来点燃一个Part。我们先这样定义这个函数:
  1. function lightOnFire()
  2.   print("Lighting on fire!")
  3. end
复制代码
定义函数有几个很重要的内容。首先,我们必须输入特殊的关键词function来开始代码行。下一个单词是我们函数的名称。变量的命名要遵照命名规则(不能有空格,不能以数字开头等)。接下来,我们写一个括号。然后我们添加我们想要在调用该函数时运行的代码。在上述情况下,我们打印一段文字Lighting on fire!,它将调用该函数时运行。在我们输入完所有我们想要运行的代码后,以关键字end结束。
我们的函数还没完全写好,但我们可以现在先调用它来测试一下。也许你已经注意到了,当你现在运行游戏的时候,没有发生任何事情——我们想要打印的文字没有出现在Output栏中。那是因为我们虽然已经定义了函数,但却没有调用它。因此,我们要像调用其他函数那样调用这个函数:以函数名+括号的形式来调用。
  1. function lightOnFire()
  2.   print("Lighting on fire!")
  3. end

  4. lightOnFire()
复制代码
现在,如果我们运行游戏,你会在Output栏中看到“Lighting on Fire!这句话。

# 在定义函数的时候,你必须确保你定义函数的代码在调用函数代码的前面。刚才的代码之所以起了作用,是因为我们先定义了函数,然后调用了它。如果我们写成下面的样子:
  1. lightOnFire()

  2. function lightOnFire()
  3.   print("Lighting on fire!")
  4. end
复制代码
这段代码将不会起任何作用。我们在第一行就调用了函数lightOnFire(),但却还没定义这个函数是做什么的,因此脚本会报错。

我们继续完善函数。现在它只是打印了“Lighting on Fire!这句话,而我们希望通过调用这个函数来实现点燃特定的Part。因此接下来我们需要让这个函数告诉我们具体点燃了哪个Part。因此我们需要通过向函数传递参数(parameter)来完成这个操作。在定义函数的括号之间,我们这样写:
  1. function lightOnFire(part)
  2.   print("Going to light this part on fire:")
  3.   print(part.Name)
  4. end
复制代码
上述代码中括号里的单词Part是这个函数的参数。

现在让我们添加一把火。最简单的方法是在代码中创建一个新的实例Fire,并将其传入父Part。就像我们使用Instance.new(Part)创建一个新的Part一样,我们也可以使用Instance.new(Fire)来创建火焰。我们必须确保将Fire存储在变量中,以便我们可以设置其父属性。
  1. function lightOnFire(part)
  2.   print("Going to light this part on fire:")
  3.   print(part.Name)

  4.   fire = Instance.new("Fire")
  5.   fire.Parent = part
  6. end
复制代码
我们需要做的最后一件事情就是在当有Part触碰到我们在一开始创建的FirePart时调用这个函数。要做到这一步,我们要使用一个叫Event的东西:事件是用来在发生某件事情的时候去调用谋改革函数。比如:当两个物体互相碰撞时;当一个玩家加入游戏,而另一个玩家按下按钮时;当有事件发生时,我们可以通过很多地方来调用自定义函数。现在,我们将使用一个名叫Touched的时间,将它与我们的Parts相关联。
  1. function lightOnFire(part)
  2.   print("Going to light this part on fire:")
  3.   print(part.Name)

  4.   fire = Instance.new("Fire")
  5.   fire.Parent = part
  6. end

  7. firePart = game.Workspace.FirePart
  8. firePart.Touched:connect(lightOnFire)
复制代码
让我们来测试一下我们的游戏!点击Play,然后操作角色穿过FirePart。这时你会发现,我们的角色的腿一碰到FirePart就会着火!

Scripting5_Final.png

Waaaaaaagh!
回复

使用道具 举报

3

主题

14

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2018-5-9 10:39:05 | 显示全部楼层
灭火!
为了让我们的玩家获得一些积极的反馈,让我们提供他们另一种方法,使得玩家在踩上WaterPart之后会扑灭火焰。就像刚才我们做的点燃火焰操作一样,现在我们需要定义一个函数来扑灭火焰,并将这个函数与WaterPart的Touched事件相连。
  1. function putOutFire(part)
  2.   print("Got to put out the fire on:")
  3.   print(part.Name)
  4. end

  5. waterPart = game.Workspace.WaterPart
  6. waterPart.Touched:connect(putOutFire)
复制代码
为了灭火,我们定义一个名叫Destroy的函数。这个函数由任何Roblox的对象调用。我们这样定义这个函数:
  1. function putOutFire(part)
  2.   print("Got to put out the fire on:")
  3.   print(part.Name)

  4.   part.Fire:Destroy()
  5. end

  6. waterPart = game.Workspace.WaterPart
  7. waterPart.Touched:connect(putOutFire)
复制代码
这段代码可以用来扑灭玩家身上的火焰。但如果我们的角色完全没有着火,那我们踩在WaterPart上会发生什么?

Scripting5_Error.png

代码报错了!当然,在任何编码的时候,你都会希望你的游戏没有任何报错。因此,为了解决这个问题,我们首先要检查我们想要灭火的Part是否着火了。我们可以通过一个叫FindFirstChild的函数来轻松完成这个操作。这个函数时用来查看我们任何一个被命名的Part是否在某个部分的子目录下。现在让我们来尝试一下:
  1. function putOutFire(part)
  2.   print("Got to put out the fire on:")
  3.   print(part.Name)

  4.   fire = part:FindFirstChild("Fire")
  5.   if fire then
  6.     fire:Destroy()
  7.   end
  8. end

  9. waterPart = game.Workspace.WaterPart
  10. waterPart.Touched:connect(putOutFire)
复制代码
这个函数中,在我们打印了相关信息后,我们首先要创建一个名叫fire的变量,并将其存储为FindFirstChild(“Fire”)。在接下里的一行中,我们进行条件判断,如果着火了,那就看看有没有任何东西存储在了fire里。如果发现FindFirstChild成功地将某些内容(“Fire”)存储在了变量fire中,那么则调用下一行fireestroy()。否则,它不会做任何事情,因为它什么都没发现。如此一来,我们在调用这个函数时就不会有任何报错。
现在我们点击Play再次开始测试我们的游戏。现在我们可以通过踩在FirePart上点燃我们的角色,然后踩在WaterPart上来灭火了。

Waaaaaaagh!
回复

使用道具 举报

3

主题

14

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2018-5-9 10:44:39 | 显示全部楼层
更进一步!
让我们将我们的新代码与一些地形相结合吧!如果玩家踏上熔岩,那就让其点燃这位玩家;如果此时他们跳入水中,那就将火熄灭。这可比单纯地踩在一块板上有趣。首先,我们用Terrain工具添加(Add)一些地形:

Scripting5_Terrain.png

移动并缩放我们之前做的FirePartWaterPart,以便它们和我们刚刚添加的地形完全重叠。要记得将它们都设置为Anchor,并且将它们的CanCollide属性设置为off。同时,你还可将它们的Transparency(透明度)属性设置为半透明,以此来有助于你定位它们的位置。

Scripting5_TerrainAndParts.png
Script的最后,我们将这些Part全部设置为透明,这样它们就不会出现在游戏里了。
  1. firePart.Transparency = 1
  2. waterPart.Transparency = 1
复制代码
现在,当我们开始游戏时,我们可以跳到熔岩上点燃角色,然后跳入水中将火扑灭。

Scripting5_TerrainFinished.png

下面是完整代码:
  1. function lightOnFire(part)
  2.   print("Going to light this part on fire:")
  3.   print(part.Name)

  4.   fire = Instance.new("Fire")
  5.   fire.Parent = part
  6. end

  7. firePart = game.Workspace.FirePart

  8. firePart.Touched:connect(lightOnFire)

  9. function putOutFire(part)
  10.   print("Got to put out the fire on:")
  11.   print(part.Name)

  12.   fire = part:FindFirstChild("Fire")
  13.   if fire then
  14.     fire:Destroy()
  15.   end
  16. end

  17. waterPart = game.Workspace.WaterPart
  18. waterPart.Touched:connect(putOutFire)

  19. firePart.Transparency = 1
  20. waterPart.Transparency = 1
复制代码


Waaaaaaagh!
回复

使用道具 举报

1

主题

3

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2018-5-9 13:47:07 | 显示全部楼层
66666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 创建账号

本版积分规则

Archiver|手机版|小黑屋|robloxchina

GMT+8, 2020-9-24 12:27 , Processed in 0.049446 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表