1. 蓝图_自动门

1. 蓝图制作自动开关门

当小白人靠近,则打开门,离开则自动关上门。

  1. 事先准备好门和小白人在关卡中

image-20230325132559961

  1. 对门进行碰撞设置----双击并添加盒体碰撞;门改为可移动性。

  2. 对门添加感应装置----盒体触发器

image-20230325133535355 4. 选中盒体触发器----打开关卡蓝图----右键----触发盒子的两个事件(OnActorBeginOverlap和OnActorEndOverlap)
  1. 选中门-----在蓝图里面右键为其创建一个引用(为的是让这个门进行旋转,门就是这个事件的目标)

  2. 此时当这个小白人靠近门时,门就是进行一瞬间的旋转,没有一个工作的过程。

image-20230325140128273
  1. 添加时间轴----右键搜索时间轴(汉化版本不用英文搜索)

    • 双击时间轴对其进行设置

    -image-20230325141210453

    • 添加帧点。看下图第4步,假设设置为4,当我们反向开门时,1.5~4这个过程是没有变化的,到了第4秒的时候才开始反向开门,相当于具有周期性。
    image-20230325141842917
    • 进行编译,会发现当小白人会靠进门会出现一瞬间的转动,没有门转动的过程,为此添加弧线。
image-20230325142323079
  1. 蓝图总设计如图所示

image-20230325143213007


2. 创建门的蓝图类

  • 首先了解一下蓝图类

image-20230325145608337

  • 创建一个Actor

  • 添加一个门框和门组件都是静态网格体组件----右边的Static Mesh进行搜索相应的部件。

  • image-20230325150455120

  • 旋转门的时绕着右下的端点进行开关门的操作,因此该部件的坐标轴就不能是在中心,而是在右下角 — 解决办法—就是把在3D建模软件进行移动坐标轴到右下角。

  • 触发盒子和门必须是同级,如果不同级的话,门旋转,触发盒子也会旋转,但是实际上要转的只是门。

    image-20230325151807939

  • 看下面这个图的区别:设置Actor相对旋转是类里面的全部组件都要进行旋转,其余两个是类里面某些组件进行旋转,不同的是相对位置和绝对位置的区别。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传image-20230325153417258

  • 其余设计与上面一样,这样做的好处是我们很容易的做出上千扇门,不用一个一个进行设计。

  • image-20230325220521219
  • image-20230325220555960
  • 由此就得到上面Door_BP的一个蓝图类了,直接拖动即可。


3. 用按键实现开关类

首先了解Gate节点,以我们的开关门的例子来说,当靠近门时,说明它是可以打开这门条件,实际上是没有打开门,需要我们按下E并且靠近门才能打开,E相当于是个钥匙,而Gate相当于if条件判断。通俗一点,靠近门拥有打开门的条件,离开是拥有关上门的条件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Jxp4Aw1-1683040024808)(null)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vr9DtV5m-1683040018521)(C:/Users/王川/AppData/Roaming/Typora/typora-user-images/image-20230325222621912.png)]

还需要让系统能够识别到按键的操作,添加了启用输入禁用输入两个节点,从这两个节点可以看出Player Controller是谁?让这个控制器告诉我们是否开启了这个键盘的输入----获取玩家控制器节点

也就是说开启角色输入,按键的输入才能够有效。

image-20230325223911712

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-siTS1kB7-1683040024828)(null)]

Flip Flop节点的意思是第一次走A,第二次走B,第三次走A,以此类推。相当于第一次按E开门,第二次按E,就是关门。

image-20230325224416694


4. 鼠标点击开关门

首先将点击时节点替换掉上面的按键E,打开世界场景设置,点击+,进入并勾选;目的是为了设置鼠标能够门上显示鼠标这个标记。

image-20230325225237580

image-20230325225015091

连成下面这个类型,记得把上面的显示鼠标光标取消掉。

image-20230325231201396 ----

5.实现鼠标双开门

image-20230328124728370 image-20230328124742339 image-20230328124843620

前面部分与鼠标点击开关门是一样的蓝图,仅仅是最后部分不一样,旋转门的大小设置也就是插值节点进行手动插值。这个门的还有做法就是人在门的那个方向,开门的时候往反方向开门,需要对其进行判别。

6.实现按键电梯

image-20230328125807669

image-20230328125856419 image-20230328125907051

看一看时间轴的相关功能

image-20230328130206116 ---

7.实现按键绝地求生双开门


8.拾取钥匙开关门(蓝图类直接的通信)

首先建立一个用按键实现的开关的蓝图类,如图所示。

image-20230325224416694

image-20230330080942013

image-20230330081012088

我们要做的是拾取钥匙开门,意思我们要有钥匙在,才能开启门,因此在按下键盘e时,还要判断是否有钥匙,有钥匙判断为能开门,没有钥匙则不能。

新建一个变量门是否能开门,并设置布尔变量:

image-20230330081454193

image-20230330081530562

分支这个节点相当于if条件判断,为True进行开门操作,为false 提示尼没有钥匙。接下来就是当我们拾取到这个钥匙,想办法让这个门是否能开门节点打勾,一定是拾取了钥匙这个操作,才能打勾,千万不能直接设置为默认值打勾,如果直接设置默认值打勾,就不需要拾取钥匙这个操作了,按下e直接就能开门了。

image-20230330081919607

设置钥匙蓝图类,仅仅演示操作,钥匙用的立方体进行代替,并且添加球体碰撞体。

image-20230330082215606

按下e进行拾取操作,与前面一致。

image-20230330082335597ll)]

与开关门蓝图类建立通信,out Actors指的是场景中的所有蓝图类实例化,假设场景中有一百扇门,这个指的就是100扇门的数组。

image-20230330082510964

Get 这个这个节点是获取这个数组中某一个元素的引用,

image-20230330082854909

image-20230330083903733

目的是为了门是否能打开这个节点为是这个操作,即为set节点打上勾,两个蓝图类就建立了通信。销毁Actor节点是在我们拾取钥匙这个操作之后,地面上的钥匙就应该消失,也就是c++的销毁释放操作。

image-20230330082740167 钥匙蓝图类: image-20230330085220425

门蓝图类:

是否能打开**这个节点为是这个操作,即为set节点打上勾,两个蓝图类就建立了通信。销毁Actor节点是在我们拾取钥匙这个操作之后,地面上的钥匙就应该消失,也就是c++的销毁释放操作。

image-20230330082740167

钥匙蓝图类:

image-20230330085220425

门蓝图类:

image-20230330085304712
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常抱歉,我的回答中存在错误。在Carla 0.9.13中,Vehicle类没有set_velocity方法,而是使用apply_control方法来控制车辆的行驶。同时,需要注意在回调函数中使用全局变量npc_vehicle时,需要在函数内使用global关键字声明该变量为全局变量。修正后的代码如下: ```python import carla import time # 定义生成npc车辆的函数 def spawn_npc(location): blueprint_library = world.get_blueprint_library() # 获取所有可以作为NPC的车辆蓝图 npc_blueprints = [x for x in blueprint_library.filter('vehicle.*') if int(x.get_attribute('number_of_wheels')) == 4] # 随机选择一种车辆蓝图 blueprint = random.choice(npc_blueprints) # 生成车辆 npc_vehicle = world.spawn_actor(blueprint, location) return npc_vehicle # 连接到Carla服务器 client = carla.Client('localhost', 2000) client.set_timeout(10.0) # 获取世界 world = client.get_world() # 设置起点和终点位置 location_a = carla.Vector3D(0, 0, 0) location_b = carla.Vector3D(100, 0, 0) # 生成一个npc车辆,并设置其行驶方向和速度 npc_vehicle = spawn_npc(location_a) control = carla.VehicleControl(throttle=1.0, steer=0.0) npc_vehicle.apply_control(control) # 将npc车辆的方向设置为指向B点 direction = location_b - npc_vehicle.get_location() rotation = direction.get_rotation() npc_vehicle.set_transform(carla.Transform(npc_vehicle.get_location(), rotation)) # 创建一个触发器,当npc车辆进入该触发器时,将其删除并重新生成在A点 trigger = world.add_trigger_volume(carla.BoxTrigger(location_a, carla.Vector3D(10, 10, 10), 0, 0)) def on_npc_vehicle_entered(triggered_actor, other_actor): global npc_vehicle if npc_vehicle is triggered_actor: npc_vehicle.destroy() npc_vehicle = spawn_npc(location_a) control = carla.VehicleControl(throttle=1.0, steer=0.0) npc_vehicle.apply_control(control) direction = location_b - npc_vehicle.get_location() rotation = direction.get_rotation() npc_vehicle.set_transform(carla.Transform(npc_vehicle.get_location(), rotation)) trigger.actor_entered_trigger.connect(on_npc_vehicle_entered) # 等待一段时间后关闭Carla连接 time.sleep(10) world.remove_actor(npc_vehicle) world.remove_actor(trigger) client.disconnect() ``` 上述代码中,我们使用apply_control方法来控制npc车辆的速度和行驶方向。在回调函数中,我们使用global关键字声明npc_vehicle为全局变量,从而可以在函数内修改其值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值