Unity入门开发实战——俯视角3D射击游戏项目实战

Unity俯视角射击游戏开发实战:从场景搭建到AI实现 游戏开发的核心在于构建一个稳定且富有交互性的虚拟世界,其底层原理涉及实时渲染、物理模拟与逻辑运算的协同。在技术实现层面,Unity引擎通过组件化架构和物理系统为开发者提供了高效的工具链,其价值在于大幅降低了游戏原型的开发门槛,使独立开发者能够专注于玩法创新。俯视角射击作为一种经典的游戏类型,广泛应用于动作冒险、Roguelike等场景,它要求开发者处理好摄像机控制、角色移动与射击交互等关键技术点。本文以Unity引擎为基础,详细解析了如何构建一个完整的俯视角射击游戏,其中涉及玩家控制器、敌人AI行为树等核心 阅读详情
AI摘要

本文分享适合新手的Unity俯视角3D射击游戏开发项目。介绍了实现功能,如玩家移动、摄像机跟随、武器系统、敌人行为逻辑、子弹击中逻辑和人物死亡效果等。还给出了各功能的实现思路及部分代码,参考自《Unity3D脚本编程和游戏开发》。

第二章_2.6_3D射击游戏实现

前言
由于工作用的电脑配置太低了,在优快云中编写的笔记字数一多就会卡,所以这段时间的笔记就一直没有上传。
这个项目是我在学习的Unity开发中认为一个比较好且非常适合新手做的项目,所以在这里分享给大家。
本项目参考自《Unity3D 脚本编程和游戏开发》中的第二章,强烈建议大家阅读,是本很适合新手入门的书。
在这里插入图片描述

本项目的资源文件:资源下载

2.6.0 效果

实现效果

2.6.1 实现功能

  • 玩家移动
  • 摄像机跟随
  • 武器系统和子弹
  • 敌人角色
  • 子弹击中逻辑
  • 人物死亡效果

2.6.2 创建主角以及玩家移动

创建主角主要由一个胶囊体作为主体,一个方体作为面部,其效果如下:

在这里插入图片描述

另外,我们将一个平面作为地板,其大小放大四倍。

主角移动逻辑代码

代码逻辑:

  1. 获取玩家输入,将输入封装为一个向量
  2. 在玩家角色并未死亡的前提下,根据玩家输入向量设置玩家的移动速度
  3. 根据玩家的输入向量设置玩家朝向
  4. 限制玩家的移动范围,超出范围将玩家修改为范围内
    
     void Update()
    {
   
   
        inputVector = GetInputVector();
        if (!isDead)
        {
   
   
            Move();
        }
    }

    /// <summary>
    /// 获取玩家输入向量
    /// </summary>
    /// <returns>玩家输入向量</returns>
    private Vector3 GetInputVector()
    {
   
   
        float horizontalInput = Input.GetAxisRaw("Horizontal");
        float verticalInput = Input.GetAxisRaw("Vertical");
        return new Vector3(horizontalInput, 0, verticalInput);
    }

     /// <summary>
    /// 玩家移动方法
    /// </summary>
    private void Move()
    {
   
   
        //设置移动速度
        AdjustVelocity();
        //设置玩家朝向
        AdjustForward();
        //设置边界
        BorderLimit();

        /// <summary>
        /// 设置玩家速度
        /// </summary>
        void AdjustVelocity()
        {
   
   
            //将输入向量归一化,向量的模长为1,保证每个方向的速度相同
            inputVector = inputVector.normalized;
            rb.velocity = inputVector * speed;
        }

        /// <summary>
        /// 设置玩家朝向
        /// </summary>
        void AdjustForward()
        {
   
   
            //如果输入的值不是很小的话,将物体转向前进方向
            if (inputVector.magnitude > 0.1f)
            {
   
   
                transform.forward = inputVector;
            }
        }

        /// <summary>
        /// 限制玩家移动范围
        /// </summary>
        void BorderLimit()
        {
   
   
            //限制玩家的移动范围
            Vector3 temp = transform.position;
            //Math.Clamp(value,min,max) : 在最大最小范围中间取值,如果超过范围,则返回最大/最小值
            temp.x = Mathf.Clamp(temp.x, -BORDER, BORDER);
            temp.z = Mathf.Clamp(temp.z, -BORDER, BORDER);
            transform.position = temp;
        }
    }

知识点

①:向量归一化

向量归一化,即将向量的长度改为1。

假设vector为一个向量,可以使用vector.normalized来获取这个向量的归一化向量,或者使用vector.Normalize()来将这个向量归一化。

②:Mathf.Clamp(value,min,max)

使value在min和max中间取值,如果value大于最大值在返回max,如果小于最小值那么返回min

③:内部方法

在方法内部的方法,C#的特性,允许我们在一个方法的内部再编写方法。

但是编写的方法仅仅可以在方法内部被调用。

目前貌似不推荐使用这个方法,因为这样限制了方法的复用度,以后不用了。

④:transform.forward

物体面朝方向,长度为1,初始情况下是面向Z轴方向,此时transform.forward为(0,0,1)。之后随着物体旋转而改变。

2.6.3 摄像机跟随

我们创建一个2D Camera,并且将其跟随的目标设置为Player物体即可。

请添加图片描述

注意:我们必须创建2D Camera,如果创建的物体是Virtual Camera的话,摄像机会随着玩家转向也一起转向。

2.6.4 实现武器系统

书中的武器系统较为简陋,没有创建武器对应的类,不利于以后添加新的武器。所以在此我做出了一点小调整:

  • 创建Gun类,其中包括武器的相关信息(包括开火位置、射速、子弹数等)

  • 在人物物体(GameObject)之下创建一个名为WeaponBag的物体,其中子物体是武器物体。

    • 武器物体包括几个简单物体拼接而成的武器模型
    • 武器物体挂载Gun脚本的组件,以此设置武器的属性
    • 武器物品必须要有一个名为FirePosition的空物体,此物体表示该武器的开火位置,也就是“子弹从哪里打出来”
  • WeaponBag物体上挂载了一个对应的脚本,其脚本的作用是获取WeaponBag的所有子物体中的所有子物体的Gun组件

  • 所有武器的操作由WeaponController操控,WeaponController目前实现了武器开火以及武器切换这两个重要功能

  • 当然最后还有创建子弹相关的脚本以及物体

Gun类代码

代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 枪械类
/// </summary>
public class Gun : MonoBehaviour
{
   
   
    /// <summary>
    /// 射出的子弹
    /// </summary>
    public GameObject bulletPerfab;
    /// <summary>
    /// 射击间隔
    /// </summary>
    public float fireCD;
    /// <summary>
    /// 是否持续射击
    /// </summary>
    public bool isHoldToFire;
    /// <summary>
    /// 一次射击的子弹个数
    /// </summary>
    public int onceFireBulletNumber;
    /// <summary>
    /// 子弹射出间隔角度(当子弹个数为复数时使用)
    /// </summary>
    public float bulletAngle;
    /// <summary>
    /// 每个子弹伤害
    /// </summary>
    public float damage;
    /// <summary>
    /// 子弹飞行速度
    /// </summary>
    public float bulletVelocity;
    /// <summary>
    /// 子弹持续时间
    /// </summary>
    public float bulletLifeTime;
    /// <summary>
    /// 子弹射出位置
    /// </summary>
    public Transform fireTransform;
}

一个简单的Gun物体示例:

请添加图片描述

WeaponBag功能实现

实现原理如图:

在这里插入图片描述

为了代码的灵活性,我们并不需要手动设定规定一个人物物品持有几个武器。所以就需要在WeaponBag的组件中使用GetComponentsInChildren()方法,获取子物体中的所有Gun组件,并且将他们存放在一个数组中。

实现代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WeaponBag : MonoBehaviour
{
   
   
    public List<Gun> guns;
    // Start is called before the first frame update
    void Awake()
    {
   
   
        //获取所有子物体的Gun组件
        Gun[] gunsInBag = GetComponentsInChildren<Gun>();
        guns = new List<Gun>(gunsInBag);
    }
}

如此一来,我们的WeaponController只需要获取WeaponBag组件,就可以“知道”这个人物有多少种枪械了。

WeaponController实现

WeaponController主要实现了武器开火和武器切换功能。

  • 武器切换

武器切换的逻辑:设置一个int类型的变量curGun,当切换武器时curGun在weaponBag的guns列表中增加,如果超出列表下标则回到最初的0下标;当武器切换时,先将当前武器(旧武器)设置为未激活状态,再等curGun增加后,将目前武器(新武器)设置为激活状态。

另外:在WeaponContoller启动时会将除了curGun之外的所有武器都设置为未激活状态。

实现代码:

    /// <summary>
    /// 切换武器
    /// </summary>
    /// <returns>当前武器序号</returns>
    /// <remarks>
    /// 将当前武器设置为未激活,然后将列表中的下一个武器激活
    /// </remarks>
    public int ChangeWeapon()
    {
   
   
        DeactiveCurrentWeapon()
3Dunity游戏项目实战——第一人称射击游戏 一、游戏策划 1.1 游戏介绍 在游戏场景中,会有若干个敌人出生点,定时生成一些敌人,敌人会主动寻找并攻击主角。游戏目的就是生存下去,消灭僵尸敌人,获得更高的积分。 1.2 UI界面 在游戏界面,包括主角的生命值,弹药数量,得分以及瞄准星。 游戏失败后,出现一个重新开始的按钮。 1.3 主角 第一人称视角无法看到主角自己,在屏幕上只能看到一致端起来的M16枪械,键盘W、S、A、D键控住主角上下左右移动,鼠标移动来旋转视角。 1.4 敌人 敌人是一个护士模样的僵尸,具有自动寻路的功能,躲避障碍物,并攻击主角。 阅读详情

相关推荐

dotween unity 延时_3D俯视角射击——用Unity还原东方弹幕(上)

前言之前我们的专栏中介绍过2D的俯视角射击,这次就来试试在3D场景下的实现。移动射击的实现方法差不多,所以本次的主要目标是在3D场景下还原东方的符卡(弹幕)效果。我们先来看看最终结果:可配置的弹幕样式本文主要内容:1. 3D场景俯视角射击2. 可配置化弹幕3. 还原东方弹幕注:为了提升表现效果而使用的模型动画、屏幕后效(PostProcessing)等方法不在本次教程范围内。同时本文只写出了部分关...

weixin_35046650的博客 751

AI辅助像素风俯视角射击游戏开发全流程实战

游戏开发涉及美术、程序与设计的复杂整合,对独立开发者而言门槛较高。现代开发流程中,通过引入AI工具链,可以将创意实现过程模块化,显著提升生产效率。其技术原理在于利用生成式AI模型辅助内容创作与代码生成,核心价值在于降低资源制作成本、加速原型验证。在像素风、俯视角射击等特定游戏类型中,AI能高效生成风格统一的美术素材,如角色精灵图、地图瓦片集,并通过代码助手优化游戏逻辑实现。本文以实战为导向,系统拆解如何结合Stable Diffusion等AI工具与Godot引擎,完成从概念设计、资源生成、核心机制编码到最

weixin_34389926的博客 527

Unity俯视角游戏:TopDown Engine实战,从2D到3D的角色控制器解析

在游戏开发中,角色控制器是决定操作手感与玩法表现的核心模块,尤其俯视角类型对移动反馈、碰撞响应和2D/3D差异尤为敏感。面对多平台输入兼容和动态能力扩展,传统状态机容易陷入耦合与维护困境。采用组件化架构,将移动、跳跃、射击等能力拆分为独立模块,可显著提升复用性与迭代效率;配合对象池化技术,能有效降低GC压力,保障大量子弹和敌人场景下的稳定帧率。这类实践广泛应用于俯视角射击生存游戏的原型验证与正式开发。本文以TopDown Engine为例,深入解析其组件式角色控制器设计、2D/3D切换关键差异、射击玩法搭建

weixin_28309723的博客 222

Unity TopDown Engine框架实战:2D/3D俯视角游戏开发全解析

俯视角动作游戏开发中,角色控制、AI决策与物理表现是共通的技术挑战。通过组件化架构与状态机分层,可将移动、冲刺、武器等能力拆分为可复用模块,实现数据驱动设计。采用ScriptableObject进行数值管理,结合多端输入适配与2D/3D统一物理接口,显著降低多平台适配成本。该框架不仅适合RogueLike弹幕、3D探索、团队合作等玩法快速搭建,还能作为学习Unity架构设计的范例。从角色搭建、AI敌人配置到性能优化,工程实践中需注意碰撞层精简、对象池化及升级迁移等关键点。基于TopDown Engine实际

weixin_32349561的博客 237

Unity俯视角动作游戏开发:TopDown Engine框架核心解析与实践

在Unity游戏开发中,角色控制、武器射击、敌人AI等基础系统往往消耗大量开发时间。组件化架构通过将能力拆分为可复用的模块,让开发者从底层逻辑中解放出来。TopDown Engine作为一套成熟的2D/3D通用型俯视角动作游戏框架,内置了移动、瞄准、武器、AI、对象池等完整解决方案。它基于CharacterAbility组件的乐高式设计,支持跨维度扩展,配合Cinemachine相机和物理碰撞系统,可快速搭建《元气骑士》类俯视角射击或探索玩法原型。从输入系统适配到手感调优,框架提供了可调的加速度、散布、后坐

weixin_28717467的博客 307

【Unity 实战100例】 教程 专栏《导航目录帖》带你深入学习Unity实战经验

Unity 实战100例 教程 专栏 导航帖,正在积极更新中! 本系列博客争取把Unity入门阶段的实战小项目都包含住。 本专栏适用人群:对Unity有一个基本的认识,开始上手Unity的实战内容。 当然你也完全可以零基础观看本系列博客,如果需要速学Unity也可以来这个专栏学习Unity系统学习专栏⭐️ Unity 实战100例 教程

努力前行,总会成为自己心中的那道光 6万+

使用团结引擎开发Unity 3D射击游戏

本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。

youmangu的专栏 5143

Unity 2D俯视角射击游戏源码实战解析:角色控制、敌人AI与血条UI

游戏开发工程实践中,读懂一套完整的源码项目往往比零散教程更有价值。核心在于理解“完整战斗循环”——从玩家操控、开火命中、敌人扣血到UI反馈、波次推进、游戏结束这一闭环。其中,对象池优化子弹性能、状态机管理敌人行为、WorldSpace血条与伤害飘字反馈,都是构建可玩性的关键技术。在2D俯视角射击场景下,移动与瞄准分离的输入处理、遮挡排序、波次刷怪等也是常见挑战。本文以一个unity2d血条与战斗系统完整的俯视角射击源码项目为例,拆解角色控制、敌人生成、血条UI、状态管理等模块的设计思路,帮助开发者从可运行的

weixin_30721077的博客 405

Unity3d 第三人称射击源码

简单的Unity3d 第三人称射击游戏源码。适合新手学习

使用 Claude Skills 构建专业级 AI Agent:技术实践指南

Claude Skills(也称)是一组基于文件系统的可重用资源包,为 Claude 提供特定领域的专业知识、标准化工作流程和最佳实践。与传统一次性 Prompt 不同,Skills 是持久化、自动触发、支持代码执行的智能模块。让 AI 真正理解并执行你的工作方式。Claude Skills 正在重新定义 AI 助手的边界——从“回答问题”升级为“执行专业工作的能力”。其可组合、可移植、高效、强大的特性,使其成为自动化重复任务、标准化工作流、提升团队效率的理想工具。未来已来。

weixin_44058951的博客 2226

树莓派5安装ROS1避坑指南:从系统配置到cmake报错全解决

本文详细介绍了在树莓派5上安装ROS1的完整流程,包括系统配置、环境变量设置、cmake报错解决等关键步骤。针对树莓派5的ARM架构特性,提供了从基础安装到高级调试的系统级解决方案,帮助开发者高效部署ROS1并避免常见编译陷阱。特别针对cmake报错问题,给出了深度解析和实用修复方法。

spark7igniter的博客 233

从Wi-Fi到蓝牙:手把手教你用Cadence Virtuoso搭建一个2.4GHz锁相环频率综合器(含PFD/CP/VCO模块设计)

本文详细介绍了如何在Cadence Virtuoso中设计一个2.4GHz锁相环频率综合器(PLL),涵盖从系统架构到模块级设计的全流程。重点解析了PFD、CP和VCO等核心模块的设计技巧与仿真验证方法,帮助模拟集成电路设计师掌握高频PLL的实现要点,满足Wi-Fi和蓝牙等无线通信标准的要求。

weixin_30315723的博客 418

基于STM32控制直流电机加减速正反转仿真设计

*单片机设计介绍,基于STM32控制直流电机加减速正反转仿真设计。

2201_75940997的博客 1603

MTK Tunning ISP 模块面试总结

ISP面试问答

m0_72053187的博客 4537

【智驾与大模型】端到端与多模态大模型的精彩之旅

智驾和大模型的回顾与展望。开头的笔者自述也说了些心窝子话,边缘计算的监管刻不容缓!

仿生实验室:从0到1,制作人脸表情交互机器人,记录过程,软硬件全部开源,与君共襄盛举! 1318

FPGA远程升级避坑指南:用AXI Quad SPI IP读写N25Q128 Flash的完整流程

本文详细介绍了FPGA远程升级过程中使用AXI Quad SPI IP读写N25Q128 Flash的完整流程,包括IP核配置、Flash操作指令集、双镜像备份设计及生产级远程升级协议。通过最佳实践和避坑策略,帮助开发者实现可靠的镜像更新方案,提升系统可靠性和可维护性。

weixin_30542079的博客 673

PY32F406K1CU6 FLASH模拟EEPROM

摘要:本文介绍了基于STM32 FLASH模拟EEPROM的实现方法。头文件flash.h定义了FLASH页大小(256字节)、用户存储区域(4页)及地址范围,提供了等待周期配置和地址校验宏,声明了EEPROM初始化、读写操作等函数接口。源文件flash.c实现了具体功能:配置FLASH等待周期(144MHz需3WS)、页读写擦除操作,以及EEPROM初始化(解锁-擦除-验证-锁定)和缓冲区读写功能。其中写操作采用"读页→更新→擦除→编程"的流程,确保数据安全写入。该方案适用于需要非易失

sam的博客 194

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Unity 游戏开发中处理事件依赖关系的方法
下一篇: Unity学习入门实例——第一人称射击游戏控制器
BugMaker2000
博客等级 码龄7年 84粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值