Unity 实现一个FPS游戏的全过程

news2025/7/19 6:56:07

Unity是一款功能强大的游戏引擎,它提供了各种各样的工具和功能,以帮助开发者轻松地创建精美的3D游戏和应用程序。在本文中,我们将使用Unity实现一个FPS游戏的全过程,从场景设计、角色控制、敌人AI到最终的打包发布。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

场景设计

角色控制

接下来,我们需要添加一个第一人称视角的角色,并实现角色的控制。在Unity中,我们可以使用脚本来控制角色的移动和旋转。以下是一个简单的第一人称视角角色控制脚本:

using UnityEngine;
using System.Collections;
 
public class FPSController : MonoBehaviour {
 
    public float speed = 10.0f;
    public float sensitivity = 5.0f;
    public float smoothing = 2.0f;
 
    private Vector2 mouseLook;
    private Vector2 smoothV;
 
    void Start () {
        Cursor.lockState = CursorLockMode.Locked;
    }
 
    void Update () {
        Vector2 mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
        mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity * smoothing, sensitivity * smoothing));
        smoothV.x = Mathf.Lerp(smoothV.x, mouseDelta.x, 1f / smoothing);
        smoothV.y = Mathf.Lerp(smoothV.y, mouseDelta.y, 1f / smoothing);
        mouseLook += smoothV;
        mouseLook.y = Mathf.Clamp(mouseLook.y, -90f, 90f);
 
        transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right);
        transform.localRotation *= Quaternion.AngleAxis(mouseLook.x, Vector3.up);
 
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        movement = transform.rotation * movement;
        movement.y = 0.0f;
        movement = movement.normalized * speed * Time.deltaTime;
        transform.position += movement;
    }
 
}

敌人AI

接下来,我们需要添加一些敌人,并实现敌人的AI。在Unity中,我们可以使用脚本和碰撞器来实现敌人的AI。以下是一个简单的敌人AI脚本:

using UnityEngine;
using System.Collections;
 
public class EnemyAI : MonoBehaviour {
 
    public Transform player;
    public float speed = 10.0f;
    public float detectionRange = 10.0f;
    public float attackRange = 2.0f;
    public float attackDelay = 1.0f;
 
    private bool isAttacking = false;
    private float attackTimer = 0.0f;
 
    void Update () {
        float distance = Vector3.Distance(transform.position, player.position);
        if (distance <= detectionRange) {
            Vector3 direction = player.position - transform.position;
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), Time.deltaTime * speed);
            if (distance > attackRange) {
                transform.position += transform.forward * speed * Time.deltaTime;
            } else {
                if (!isAttacking) {
                    isAttacking = true;
                    StartCoroutine(Attack());
                }
            }
        }
    }
 
    IEnumerator Attack() {
        yield return new WaitForSeconds(attackDelay);
        player.GetComponent<PlayerHealth>().TakeDamage(10);
        isAttacking = false;
    }
 
}

在上面的代码中,我们定义了一个名为“EnemyAI”的脚本,并定义了几个变量,包括玩家、移动速度、检测范围、攻击范围和攻击延迟。在Update函数中,我们首先计算敌人与玩家之间的距离。如果距离小于检测范围,我们将敌人的朝向调整为面向玩家,并向玩家的方向移动。如果距离小于攻击范围,我们开始攻击玩家。在Attack函数中,我们等待攻击延迟时间,然后减少玩家的健康值,并将isAttacking变量设置为false,以允许敌人再次攻击。

打包发布

最后,我们需要将游戏打包并发布。在Unity中,我们可以使用Build Settings窗口来打包游戏。以下是一个简单的打包发布示例:

我们首先选择File菜单中的Build Settings选项,然后将场景添加到Build Settings中。然后,我们选择所需的平台,例如Windows或Android,并设置输出路径和文件名。最后,我们单击Build按钮,等待游戏打包完成。

总结

在本文中,我们使用Unity实现了一个FPS游戏的全过程,从场景设计、角色控制、敌人AI到最终的打包发布。通过使用Unity的各种工具和功能,我们可以轻松地创建出精美的3D游戏和应用程序。希望本文可以帮助您更好地了解Unity的开发流程和技术实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源项目汇总

element-plus 人人开源 人人开源 多租户 若依 jeecg https://gitee.com/jeecg/jeecg?_fromgitee_search#https://gitee.com/link?targethttp%3A%2F%2Fidoc.jeecg.com jeeplus JeePlus快速开发平台 j2eefast Sa-Plus

地震勘探原理部分问题解答

1、二维/三维&#xff08;陆地/海洋&#xff09;地震勘探&#xff0c;炮点&#xff08;激发点&#xff09;和检波点&#xff08;接收点&#xff09;的排布位置如何&#xff1f;画图作答&#xff1f; &#xff08;1&#xff09;陆地地震勘探 二维陆地地震野外采集&#xff1a;震…

过滤器(Filter)和拦截器(Interceptor)有什么不同?

过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;是用于处理请求和响应的中间件组件&#xff0c;但它们在实现方式和应用场景上有一些不同。 实现方式: 过滤器是Servlet规范中定义的一种组件&#xff0c;通常以Java类的形式实现。过滤器通过在…

Python文件共享+cpolar内网穿透:轻松实现公网访问

文章目录 1.前言2.本地文件服务器搭建2.1.Python的安装和设置2.2.cpolar的安装和注册 3.本地文件服务器的发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用&#…

yolov7改进优化之蒸馏(一)

最近比较忙&#xff0c;有一段时间没更新了&#xff0c;最近yolov7用的比较多&#xff0c;总结一下。上一篇yolov5及yolov7实战之剪枝_CodingInCV的博客-CSDN博客 我们讲了通过剪枝来裁剪我们的模型&#xff0c;达到在精度损失不大的情况下&#xff0c;提高模型速度的目的。上一…

6.6 图的应用

思维导图&#xff1a; 6.6.1 最小生成树 ### 6.6 图的应用 #### 主旨&#xff1a;图的概念可应用于现实生活中的许多问题&#xff0c;如网络构建、路径查询、任务排序等。 --- #### 6.6.1 最小生成树 **概念**&#xff1a;要在n个城市中建立通信联络网&#xff0c;则最少需…

【Mysql】Innodb数据结构(四)

概述 MySQL 服务器上负责对表中数据的读取和写入工作的部分是存储引擎 &#xff0c;而服务器又支持不同类型的存储引擎&#xff0c;比如 InnoDB 、MyISAM 、Memory 等&#xff0c;不同的存储引擎一般是由不同的人为实现不同的特性而开发的&#xff0c;真实数据在不同存储引擎中…

如何让大模型自由使用外部知识与工具

本文将分享为什么以及如何使用外部的知识和工具来增强视觉或者语言模型。 全文目录&#xff1a; 1. 背景介绍 OREO-LM: 用知识图谱推理来增强语言模型 REVEAL: 用多个知识库检索来预训练视觉语言模型 AVIS: 让大模型用动态树决策来调用工具 技术交流群 建了技术交流群&a…

微信小程序会议OA系统

Flex弹性布局 Flex弹性布局是一种 CSS3 的布局模式&#xff0c;也叫Flexbox。它可以让容器中的元素按一定比例自动分配空间&#xff0c;使得它们在不同宽度、高度等情况下仍能保持整齐和密集不间隙地排列。 在使用Flexbox弹性布局时&#xff0c;首先需要创建一个容器和若干个…

JNDI-Injection-Exploit工具安装

从github上下载安装 git clone https://github.com/welk1n/JNDI-Injection-Exploit.git 打开 cd JNDI-Injection-Exploit 编译安装&#xff0c;Maven入门百科_maven中quickstart是什么意思-CSDN博客 mvn clean package -DskipTests 因为提示mvn错误&#xff0c;解决下…

Spring中Setter注入详解

目录 一、setter注入是什么 二、setter注入详解 三、JDK内置类型注入方式 3.1 数组类型 3.2 set集合类型 3.3 list集合 3.4 map集合 3.5 properties类型 四、用户自定义类型 一、setter注入是什么 书接上回&#xff0c;我们发现在Spring配置文件中为类对象的属性赋值时&#x…

java SpringBoot基础

目录 SpringBootWeb快速入门前言需求开发步骤创建SpringBoot工程&#xff08;需要联网&#xff09;定义请求处理类运行测试 HTTP协议HTTP概述HTTP-请求协议格式GET方式的请求协议POST方式的请求协议 HTTP-响应协议格式HTTP-协议解析 WEB服务器-Tomcat简介基本使用注意事项 Spri…

智慧渔业方案:AI渔政视频智能监管平台助力水域禁渔执法

一、方案背景 国内有很多水库及河流设立了禁渔期&#xff0c;加强渔政执法监管对保障国家渔业权益、维护渔业生产秩序、保护渔民群众生命财产安全、推进水域生态文明建设具有重要意义。目前&#xff0c;部分地区的监管手段信息化水平低下&#xff0c;存在人员少、职责多、任务…

排序【七大排序】

文章目录 1. 排序的概念及引用1.1 排序的概念1.2 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1基本思想&#xff1a;2.1.2 直接插入排序2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1基本思想&#xff1a;2.2.2 直接选择排序:2.2.3 堆排序 2.3 交换排序2.3.1冒…

新一代开源语音库CoQui TTS冲到了GitHub 20.5k Star

Coqui TTS 项目介绍 Coqui 文本转语音&#xff08;Text-to-Speech&#xff0c;TTS&#xff09;是新一代基于深度学习的低资源零样本文本转语音模型&#xff0c;具有合成多种语言语音的能力。该模型能够利用共同学习技术&#xff0c;从各语言的训练资料集转换知识&#xff0c;来…

Leetcode刷题详解——将x减到0的最小操作数

1. 题目链接&#xff1a;1658. 将 x 减到 0 的最小操作数 2. 题目描述: 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作…

windows常用命令

一.文件操作 dir&#xff1a;查看文件当前路径目录列表 cd .. &#xff1a;返回上一级目录 cd 路径&#xff1a;进入路径

解决telnet不是内部或外部以及验证某个端口是否开放

1.怎么解决telnet不是内部或外部命令 &#xff08;1&#xff09;telnet在win10下默认是不开启的&#xff0c;所以需要我们自己手动开启。 &#xff08;2&#xff09;在控制面板中&#xff0c;我们选择程序–启动或关闭windows功能&#xff0c;然后勾选Telnet客户端选项&#…

Python 连接数据库添加字段

任务需求&#xff1a; 数据库hospital集合所有数据添加一个八位数的编码 import pymongo# 连接数据customer&#xff08;库&#xff09;hospital&#xff08;集合&#xff09; client pymongo.MongoClient(host127.0.0.1) db client.customer collection db.hospitalhospit…