unity 敌人自动攻击和寻路_Unity暑期萌新入门:环境篇

fa459b9de902139e8f6c08b75efbbdd2.png

大家好,新一期又跟大家见面了。

上一节我们完成了角色的移动控制,然而John只能在空白的场景中移动。因此接下来这一节我们将添加关卡、调节光照,让John来到阴森的鬼屋。然后设置NavMesh(导航网格,现在先听个概念就好),为以后添加会巡逻的幽灵作准备。

69cb24e44c69b0ead4c431921641f3b3.gif
是不是越来越像那么回事了?

一、添加关卡

1 创建关卡实例

在Project窗口中打开Assets> Prefabs文件夹,找到Level 的预制体,把它拖到Hierarchy窗口中。

81bbf68a81f321c0f75b3241964c5ea9.gif

2 把JohnLemon移动到关卡中

(1) 在Hierarchy窗口中,选中JohnLemon GameObject。

(2) 在Inspector窗口中,修改transform组件里Position属性(-9.8,0,-3.2)

bf230e9c3436101644d43b51b90482cd.png

二、调节光照

光照是烘托气氛的重要元素,接下来我们调节光照,使鬼屋关卡看起来更加幽暗。

1 Directional Light(方向光)可以模拟像太阳这类远处的光源。

cf3182aac6b3e4890559377fa221b453.png
图片来源:https://learn.unity.com/tutorial/the-environment?projectId=5caf65ddedbc2a08d53c7acb#5caf7befedbc2a0ded5950d4

设置Directional Light

d39a6f1a8a4fd125cdbf25a02079270c.png

在Hierarchy窗口中,选中Directional Light:

(1) 在Inspector窗口中,Light组件里的Type下拉菜单栏选择Directional

(2) 点击Color属性,弹出Color picker窗口。

各个参数含义以及设置:

下拉菜单:RGB 0-255

R(红):225

G(绿):240

B(蓝):250

A(透明度):255

ea8e086100c2a33af1501fe8cab12e91.png

设置完之后关闭窗口,诡异的蓝光就做好啦~

(3) 回到Light组件,Intensity(强度)设置为2。通过设置阴影的参数,使气氛更加毛骨悚然~

(4) Realtime Shadows -> Resolution(分辨率)下拉菜单选择Very High Resolution。

(5) Realtime Shadows -> BiasNormal Bias 属性参数设置为0.1。

(6) 把Transform组件的Rotation属性设置为(30, 20, 0),旋转灯光使光线从窗户射进屋里。

a68ace3a41eb9f253e1909859489d7f1.png
调整前

2d05f4cbc38c00bdb4691a416757a5a3.png
调整后

2 全局光照

Unity中有两种光来模拟现实世界中的光照,直接光照模拟来自特定光源的光(例如上一部分设置的阳光),间接光照模拟反射光。

61e5a80a9dab66c2cd0ce12918503dfa.png
左:没有光照 中:只有直接光照 右:全局光照(直接+间接)

图片来源:https://learn.unity.com/tutorial/the-environment?projectId=5caf65ddedbc2a08d53c7acb#5caf7befedbc2a0ded5950d6

这种逼真的效果通常需要经过一段长时间的烘焙,所以我们这里采用设置近似值的方法来进行快速模拟:

(1)打开Lighting窗口

点击顶部菜单栏的Window > Rendering >Lighting Settings,点击Lighting弹窗的标签并拖动到Inspector

7169952bde93909c9fc07a1fdc2c8f0c.png

bd325b0fc6de3c35f294a22424b15e63.png

(2) 设置参数

①在Environment下,点击Skybox Material 属性右侧的小圆,弹窗里选择None。(因为这个游戏不需要显示天空)

②Environment Lighting设置:

  • Source:改为Gradient(渐变)。
  • Sky Color:控制场景里方光源,RGB设置为(170, 180, 200 )
  • Equator Color:控制场景里间的光,RGB设置为(90, 110, 130)
  • Ground Color:控制场景里方的光,RGB设置为(0, 0, 0)

61797ff71abedd6aac2bf114a1fcc691.png

(3)取消勾选Realtime Global Illumination(实时全局光照)和Baked Global Illumination(烘焙全局光照)

0d7ca144b52ac682d8396dff6a0bde49.png

设置完毕后CTRL+S保存场景。

三、 设置NavMesh(导航网格)

NavMesh是一种自动寻路的技术,我们可以用它使幽灵在场景中游走。

1 标记Static

(1) 在Hierarchy中,选中Level GameObject。

(2) 在Inspector中,勾选Static(静态),使其纳入导航范围。

8a341d903b8d1f527b75992ce94dda45.png

ce21760ce674ec9918a6ff05b30324a3.png

(3) 弹窗选择Yes,change children,把子对象也一同标记为Static

(4) 禁用(取消勾选)天花板的Static,因为这个游戏里的幽灵不能在天花板上游走。

在Hierarchy中,Level> Corridors> Dressing> Ceiling Plane 并选择Ceiling Pane GameObject,取消勾选Inspector窗口中的Static。

68e19c593964266e60dd98c4d0aeaddd.png

设置完毕CTRL+S保存场景。

2 创建NavMesh

(1) 添加Navigation窗口

在顶部菜单栏中,选择Window > AI > Navigation,窗口会出现在Inspector窗口旁。

fb505c81b2dc9f998f84aa595e8ac4ce.png

(1)设置Bake(烘焙)参数

①选中Bake选项

Agent Radius(半径)调至0.25,适配以后添加幽灵角色的半径。

③ 设置完后点击Bake按钮。

d75ce89c0615057a4799b4e3b75412b2.png

烘焙完成后,蓝色区域代表可以行走的区域,选中Navigation窗口才会显示哦。

e27b0b2675b3b8d6a89de43161d7b109.png

结语:这一节我们添加了关卡,然后设置了环境的光照烘托诡异的气氛,创建NavMesh(导航网格)为添加会移动的幽灵作准备。赶紧CTRL+P运行游戏,让John承包一次鬼屋吧~由于此时我们还没有设置摄像机跟随,所以运行时要把Game视窗拖动到一旁,在Scene视图中观察John的移动(运行后点击Game视窗然后WASD操作)。下一节我们将学习Camera篇,设置摄像头跟随以及屏幕后效(可让画面效果表现得更棒)。

迫不及待想自行开始制作的小伙伴,可以浏览John Lemon's Haunted Jaunt官方教程:

https://learn.unity.com/project/john-lemon-s-haunted-jaunt-3d-beginner

咱们的游戏开发交流群也欢迎强势插入:869551769

希望参与线下游戏开发学习的,欢~~~~~~迎访问:http://www.levelpp.com/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现敌人自动巡逻攻击,您需要按照以下步骤进行: 1. 创建一个敌人角色和一个玩家角色。您可以使用Unity中的基本形状或导入自己的3D模型。 2. 在敌人角色上添加一个脚本,以便它可以寻找并攻击玩家。在脚本中,您需要定义敌人的移动方式和攻击方式。 3. 在脚本中添加一个检测玩家的函数。您可以使用Unity提供的Collider或Raycast来检测玩家是否在敌人的视野范围内。 4. 如果敌人检测到玩家,它应该开始朝玩家移动并攻击。您可以使用Unity的导航系统来实现敌人的移动,使用动画来实现攻击。 5. 您还可以添加一些额外的功能,例如敌人的血量和死亡动画。 下面是一个简单的示例代码: ``` public class EnemyController : MonoBehaviour { public float speed = 5f; public float attackDistance = 2f; public float attackCooldown = 2f; public float health = 100f; private Transform player; private NavMeshAgent navMeshAgent; private Animator animator; private bool attacking = false; void Start () { player = GameObject.FindGameObjectWithTag("Player").transform; navMeshAgent = GetComponent<NavMeshAgent>(); animator = GetComponent<Animator>(); } void Update () { if (health <= 0) { Die(); return; } if (Vector3.Distance(transform.position, player.position) < attackDistance) { if (!attacking) { StartCoroutine(Attack()); } } else { navMeshAgent.SetDestination(player.position); animator.SetBool("Walking", true); } } IEnumerator Attack() { attacking = true; animator.SetBool("Walking", false); animator.SetBool("Attacking", true); yield return new WaitForSeconds(attackCooldown); animator.SetBool("Attacking", false); attacking = false; } public void TakeDamage(float damage) { health -= damage; } void Die() { animator.SetBool("Dead", true); navMeshAgent.enabled = false; Destroy(gameObject, 2f); } } ``` 在这个示例代码中,敌人会在玩家进入攻击范围时启动攻击动画。当敌人的血量降至0时,它会播放死亡动画并在2秒后销毁。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值