3D游戏编程与设计作业07

智能巡逻兵

游戏设计要求

  • 创建一个地图和若干巡逻兵(使用动画)
  • 每个巡逻兵走一个3-5个边的凸多边形,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算
  • 巡逻兵碰撞到障碍物,则会自动选下一个点为目标
  • 巡逻兵在设定范围内感知到玩家 ,会自动追击玩家
  • 失去玩家目标后,继续巡逻
  • 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束

程序设计

  • 使用MVC架构(前面的实验博客中已有详细说明,此处不再赘述)
  • 使用订阅与发布模式传消息:CoinCollideSoompiCollide将“碰撞”消息传递给GameEventManagerController,由GameEventManagerController通知其他模型
  • 工厂模式产生巡逻兵和物品

代码传送门

场景制作

地图绘制

  • 下载并导入资源Wispy SkyWinter Zone Mini
  • Skybox设置参考我之前的博客
  • 创建地形Terrain:菜单栏GameObject->3D Object->Terrain
  • 在Inspector面板上设置Terrain的Material为SnowAndRock_1
    fig

Animation&Animator

巡逻兵动画制作TODO
  • 下载并导入资源ToonyTinyPeople
  • 创建Animator:菜单栏Window->Animation->Animator
  • 具体动画制作可参考博客
  • 我的Animator最终制作结果为:
    Soompi
玩家动画制作
  • 下载并导入资源ToonyTinyPeople
  • 我的Animator最终制作结果为:
    wyb
金币动画制作
  • 下载并导入资源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拖动赋值给Controllermain_camera属性

玩家移动JoyStick

与之前HitUFO中的JoyStick实现方式不同,这里ws键控制的移动改为Z轴上的移动,ad键控制的移动则仍为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);
    }
}

参考资料

发布订阅模式与观察者模式
Unity动画机制 Animator与Animator Controller教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值