3D游戏编程与设计作业07
智能巡逻兵
游戏设计要求
- 创建一个地图和若干巡逻兵(使用动画)
- 每个巡逻兵走一个3-5个边的凸多边形,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算
- 巡逻兵碰撞到障碍物,则会自动选下一个点为目标
- 巡逻兵在设定范围内感知到玩家 ,会自动追击玩家
- 失去玩家目标后,继续巡逻
- 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束
程序设计
- 使用MVC架构(前面的实验博客中已有详细说明,此处不再赘述)
- 使用订阅与发布模式传消息:
CoinCollide
和SoompiCollide
将“碰撞”消息传递给GameEventManager
和Controller
,由GameEventManager
和Controller
通知其他模型 - 工厂模式产生巡逻兵和物品
场景制作
地图绘制
- 下载并导入资源
Wispy Sky
和Winter Zone Mini
- Skybox设置参考我之前的博客
- 创建地形Terrain:菜单栏GameObject->3D Object->Terrain
- 在Inspector面板上设置Terrain的Material为
SnowAndRock_1
Animation&Animator
巡逻兵动画制作TODO
- 下载并导入资源
ToonyTinyPeople
- 创建Animator:菜单栏Window->Animation->Animator
- 具体动画制作可参考博客
- 我的Animator最终制作结果为:
玩家动画制作
- 下载并导入资源
ToonyTinyPeople
- 我的Animator最终制作结果为:
金币动画制作
- 下载并导入资源
RPG Pack
- 可直接使用资源库中提供的Animator
摄像机跟随CameraFollow
-
创建
CameraFollow.cs
脚本:using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraFollow : MonoBehaviour { public GameObject follow; //跟随的物体 public float smothing = 5f; //相机跟随的速度 Vector3 offset; //相机与物体相对偏移位置 void Start() { offset = transform.position - follow.transform.position; } void FixedUpdate() { Vector3 target = follow.transform.position + offset; //摄像机自身位置到目标位置平滑过渡 transform.position = Vector3.Lerp(transform.position, target, smothing * Time.deltaTime); } }
-
将该脚本挂载在主摄像机下
-
将
Main Camera
拖动赋值给Controller
的main_camera
属性
玩家移动JoyStick
与之前HitUFO中的JoyStick
实现方式不同,这里w
和s
键控制的移动改为Z轴
上的移动,a
和d
键控制的移动则仍为X轴
上的移动,另外为了更好的用户游戏体验,还加入了游戏对象旋转的功能——往哪个方向移动则游戏对象正面朝向该方向。
//获取方向键的偏移量
float translationX = Input.GetAxis("Horizontal");
float translationZ = Input.GetAxis("Vertical");
if (!game_over)
{
//移动和旋转
wyb.transform.Translate(translationX * wyb_speed * Time.deltaTime, 0, translationZ * wyb_speed * Time.deltaTime, Space.World);
if (translationX < 0)
{
wyb.transform.eulerAngles = new Vector3(0, -90, 0);
}
else if (translationX > 0)
{
wyb.transform.eulerAngles = new Vector3(0, 90, 0);
}
if (translationZ < 0)
{
wyb.transform.eulerAngles = new Vector3(0, 180, 0);
}
else if (translationZ > 0)
{
wyb.transform.eulerAngles = new Vector3(0, 0, 0);
}
}