Unity-3d小游戏开发-----走迷宫

news2024/11/14 14:21:02

本人是在学习完c,c++,数据结构算法,操作系统网络这些基础的课程之后,打算学习自己喜欢的游戏开发方向的东西,然后在B站上自学了几天unity,用到unity的触发器,碰撞,刚体,以及一个简单的ui界面,但是本人目前没有c#的学习经验,但是拿c++的经验也能写出一些基础的游戏脚本,这里的参考书籍是《新印象--unity2020游戏开发基础与实战》,适合有一些编程基础的人来观看。

我将从unity的新建项目开始来一步一步的完成这个小游戏

环境为unity2021.3.16 编译器为VS2019

目录

 小游戏拆解

场地的搭建

角色的移动

玩家与墙体的碰撞检测

玩家吃金币的实现

金币吃完解锁大门

 玩家达到指定点结束游戏胜利

角色血量与UI的绑定

项目文件


 小游戏拆解

首先这个迷宫小游戏大致分为几个逻辑模块

首先问题是我们如何让角色移动起来

还有角色与墙体的碰撞检测

角色吃金币的实现

金币吃完解锁大门

玩家达到指定点结束游戏胜利

角色血量与UI的绑定

接下来将分为这些模块来将这个简单的小游戏来逐步的拆解

场地的搭建

 

先新建一个3d项目

 就会得到了这个界面,这就是unity的基础界面

 我们在这里改成2*3格式

 然后我们就可以开始开发了

我们在右键菜单栏里面新建一个平面

然后在场景窗口选中调整缩放

 这样我们就可以把这个平面成为自己的迷宫地面了

然后我们在项目栏新建一个材质,并且调整一个自己喜欢的颜色

 

 然后将新建的材质拖到平面上进行绑定

 然后接下来我们来为迷宫的墙体制造,就是将立方体选装缩放成为墙面,这里就直接略过创建过程了

 这样就将迷宫的基本框架搭建完成了,接下来制作金币的形状,就是将圆柱体缩放选装,并且添加上金色的材质

 然后创建一个平面作为我们的终点,一个门作为阻碍,并且创建一个球体作为我们的玩家

 这样我们就将游戏里面的基本地形搭建完成了。

角色的移动

实现角色的移动有很多种方法:角色控制器,或者调整Transform组件,这里选装用刚体组件控制球体的移动

我们为球体玩家添加rigidbody组件,并且新建一个c#脚本来控制方向。

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

public class PlayerMove : MonoBehaviour
{
    //设置默认移动速度
    public float player_speed = 4.0f;
    //设置玩家血量
    public int health = 3;
    //设置玩家刚体组件
    private Rigidbody rBody;
    // Start is called before the first frame update
    void Start()
    {
        //初始化玩家刚体组件
        rBody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //获取玩家水平移动方向
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        //将两个方向合成一个向量 0 是因为我们不需要y轴移动
        Vector3 dir = new Vector3(horizontal, 0, vertical);
        if (dir != Vector3.zero)
        {
            //将移动方向传给刚体组件
            rBody.velocity = dir * player_speed;
        }

    }
}

 

此时我们就可以将玩家成功移动了 

玩家与墙体的碰撞检测

 首先我们先选中迷宫的全部墙体,并且为全部的墙体添加Wall标签

 然后添加碰撞检测的功能

 我们可以看到,当碰撞超过三次,玩家就销毁自身了

玩家吃金币的实现

首先我们玩家需要吃金币而不是碰撞到金币,所以我们就需要让金币成为一个触发器,当金币被玩家触发,销毁自身,达到吃金币的效果。

首先我们为玩家添加Player标签

然后编写金币的脚本

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

public class gold : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    //unity提供的进入触发函数
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            //检测到玩家的触发,销毁自身
            Destroy(gameObject);
        }
    }
}

并且将金币设为触发器

 

 我们看到这就成功将金币吃掉了

接下来我们为金币添加一个自动旋转的功能

可以看到,我们要是想让金币旋转,需要让金币绕着x轴旋转

 

 

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

public class gold : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(Vector3.right * 90 * Time.deltaTime);
    }
    //unity提供的进入触发函数
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            //检测到玩家的触发,销毁自身
            Destroy(gameObject);
        }
    }
}

这样金币的基本功能,就基本实现了。

金币吃完解锁大门

 这个实现我是利用一个空的游戏对象,作为一个金币管理器,当三个金币成为金币管理器的子物体,当金币管理器成为金币的父对象,然后检测这个金币管理器的子物体个数,当子物体为0时,销毁门。

 创建一个空对象,作为金币管理器

将三个金币作为管理器的子物体,然后新建一个c#脚本来实现开门的逻辑

我们创建一个共有的对象,然后保存脚本

 这样我们就可以在unity界面看到一个游戏对象选项,我们拖动door绑定到游戏对象上

 

 

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

public class opendoor : MonoBehaviour
{
    public GameObject door;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //当子对象为0时,销毁大门,然后销毁自身
        if (transform.childCount <= 0)
        {
            Destroy(door);
            Destroy(gameObject);
        }
    }
}

 这样我们就实现吃完全部金币开门的功能了

 玩家达到指定点结束游戏胜利

这里我们还是来用触发器实现

 我们将结束点这个平面设置为凸面,和触发器,并且新建一个脚本来实现控制游戏胜利

我们先新建一个ui画布,并且设置为2d视图

 然后我们右键画布-》ui-》文本,并且导入Tmp的两个包

 

 修改颜色和字体,我们可以,看到胜利显示在我们的游戏画面上,我们将这个字体设置为不激活状态,这样就不会直接显示到现在的界面上,当玩家走到指定位置我们再将文本激活,显示到玩家的UI上

 

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

public class end : MonoBehaviour
{
    //得到文本
    public GameObject txt;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            //设置激活
            txt.SetActive(true);
            Destroy(gameObject);
        }

    }
}

 

 

 这样我们可以看到游戏就正常结束了。

这样其实基本的游戏功能就实现了。

角色血量与UI的绑定

我们需要将血量也显示到ui上,接下来同样在画布上新建一个文本

拖到画布的左上角,设置好文本和颜色

然后新建一个脚本

拿到我们的玩家物体,和自己的文本,然后获取玩家的血量显示出来

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.UI;
using TMPro;


public class UIhealth : MonoBehaviour
{
    public GameObject player;
    public TMP_Text text;
    // Start is called before the first frame update
    void Start()
    {
        text = GetComponent<TMP_Text>();
    }

    // Update is called once per frame
    void Update()
    {
        //获取玩家血量
        int hp = player.GetComponent<PlayerMove>().health;
        //修改显示文本
        text.text = "health:" + hp;
    }
}

 

 

 

这样我们可以看到血量成功显示到UI上了

然后我们把主摄像机的位置调整下,就可以成功完成整个游戏了

 

选中主摄像机,按ctrl+shift+f,移动到场景所显示的位置

 并且将投影设置为正交,这样就可以让我们的观看更加的轻松

这样我们整个项目就完成了开发

项目文件

链接:https://pan.baidu.com/s/1rBvYlLo5l2NNZPopze3rkQ 
提取码:jina

感谢您能看到这里,这是我初学unity以来的第一个项目,您也可以尝试自己添加其他元素

 

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

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

相关文章

图像处理入门教程:从Python到Opencv

Python编程 这里主要针对有一定基础的读者&#xff0c;在Python编程中&#xff0c;掌握基础语法和数据类型是非常重要的。它们是构建程序的基石&#xff0c;是提供解决问题和开发应用的工具。在这里&#xff0c;我将简单介绍一些常用的语法和数据类型。 一、环境搭建 详细请…

14 - 信号优先级与安全性

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 信号优先级1.1 问题1.2 信号优先级的概念1.3 信号优先级实验设计1.3.1 发送端1.3.2 接收端1.3.3 编程实验&#xff1a;信号优先级实验 …

普通索引VS唯一索引

查询性能 假设 我们有一列int 类型的value 对它进行查询 (VALUE无重复字段) SELECT value FROM table where value 8; 如过是普通索引 找到value 8 的记录后还会继续找&#xff0c;直到碰到第一个不满足 k5 条件的记录。 如过是唯一索引 找到value 8这条记录就不会往下找…

百望股份高级PMO专家赵雅婧受邀为第十二届中国PMO大会演讲嘉宾

百望股份有限公司项目管理部高级PMO专家赵雅婧女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;PMO的组织建设与持续运营。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 众所周知&#xff…

图像全景拼接

TODO: 实现图片的全景拼接 流程&#xff1a; &#xff08;1&#xff09;检测左右2图片的SIFT关键特征点&#xff0c;并计算特征描述 &#xff08;2&#xff09;使用KNN检测来自左右2图的SIFT特征&#xff0c;进行匹配 &#xff08;3&#xff09;计算视角变换矩阵H&#xff0c…

目标跟踪基础:距离度量

本文来自公众号“AI大道理” —————— 距离度量在CV 、NLP以及数据分析等领域都有众多的应用。 距离度量可以当做某种相似度&#xff0c;距离越近&#xff0c;越相似。 在目标跟踪领域中&#xff0c;需要判断目标之间的距离或相似度&#xff0c;从而判断前后帧的目标是否…

Redis实战案例13-集群下的并发安全问题

在解决一人一单的问题上面&#xff0c;采用了悲观锁的方案&#xff0c;但是这种方案只适合单机情况&#xff0c;在集群的模式下就不适用了&#xff1b; 覆盖yaml文件中的端口号 修改nginx中conf&#xff0c;这样就可以反向代理到两个节点上去&#xff0c;轮询的负载均衡规则&am…

git bash---打开当前路径所在文件夹

0 Preface/Foreword 在Windows操作系统中使用git bash时&#xff0c;可以通过命令直接打开当前路径下的文件夹&#xff0c;命令如下 explorer .

MS17-010漏洞复现

官方描述&#xff1a;Microsoft Security Bulletin MS17-010 - Critical | Microsoft Learn漏洞描述&#xff1a; Microsoft Windows SMB Server远程代码执行漏洞&#xff0c;Microsoft Server Message Block 1.0 (SMBv1)服务器处理某些请求时&#xff0c;在实现上存在远程代码…

Mockplus Cloud - June 2023crack

Mockplus Cloud - June 2023crack 添加便签以澄清情节提要上的任何设计概念。 新的流程图工具直接在情节提要上可视化任何设计流程和过程。 添加了在发布到Mockplus Cloud时删除RP页面的功能。 添加设计注释时包括图像和链接。 添加了一个新的提示&#xff0c;用于在断开互联网…

MySQL练习题(1)

1,创建如下学生表 mysql> create table student( -> id int, -> name varchar(20), -> gender varchar(20), -> chinese int, -> math int, -> english int -> ); 插入如图数据 1-- 查询表中所有学生的信息 select *from student;2-- 查询表中所有学…

mysql语句练习题,创建表,枚举中文字符集设置,修改(update)

作业&#xff1a; 1.创建表&#xff1a; 创建员工表employee&#xff0c;字段如下&#xff1a; id&#xff08;员工编号&#xff09;&#xff0c;name&#xff08;员工名字&#xff09;&#xff0c;gender&#xff08;员工性别&#xff09;&#xff0c;salary&#xff08;员工薪…

厄尔尼诺,“烤热”新能源汽车市场?

在高温极端天气中&#xff0c;买新能源汽车的人变多了还是变少了&#xff1f; 7月4日&#xff0c;世界气象组织宣布&#xff0c;热带太平洋七年来首次形成厄尔尼诺条件&#xff0c;这可能导致全球气温飙升、破坏性天气和气候模式的出现。 注&#xff1a;1月底至6月初&#xff…

【离散数学】实践二 Floyd– Warshall算法

文章目录 目标原理设计与实现&#xff08;代码快照以及代码&#xff09;运行界面和结果截图结语 目标 给定一个距离矩阵&#xff0c;利用 Floyd– Warshall 算法编程&#xff08;C语言&#xff09;求任意两点之间的最短距离。 原理 求取多源最短路径常用Floyd算法&#xff0c…

支持向量机SVM代码详解——多分类/降维可视化/参数优化【python】

篇1&#xff1a;SVM原理及多分类python代码实例讲解&#xff08;鸢尾花数据&#xff09; SVM原理 支持向量机&#xff08;Support Vector Machine,SVM&#xff09;&#xff0c;主要用于小样本下的二分类、多分类以及回归分析&#xff0c;是一种有监督学习的算法。基本思想是寻…

腾讯云对象存储的创建和S3 Browser的使用

简述 想想第一次接触对象存储的时候还是很兴奋的&#xff0c;同时也是一脸懵逼&#xff1b;然后开始网上疯狂的找资料&#xff0c;但因为客户当时给的文档写的是关于Amazon S3之类的&#xff0c;所以自以为的就只有Amazon S3这一家&#xff0c;接着开始查资料&#xff0c;经过一…

Spark学习---2、SparkCore(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))

1、RDD概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫弹性分布式数据集&#xff0c;是Spark中对于分布式数据集的抽象。代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 1.2 RDD五大特性 1、一组分区&#xff0…

Pyecharts 绘制各种统计图的案例

Pyecharts 绘制各种统计图的案例 基础使用 from pyecharts import options as opts from pyecharts.charts import Bar, Line, Pie, Scatter from pyecharts.faker import Faker# 柱状图示例 def bar_chart():x_data Faker.choose()y_data Faker.values()bar (Bar().add_xa…

simulink实战 建模 简单车辆动力学模型

Gmg Discrete-TimeIntegrator 离散时间积分器

CentOS 7 搭建 Impala 4.1.2 + Kudu 1.15.0 测试环境

安装依赖 这部分不过于详细介绍&#xff0c;如果有现成环境也可以直接拿来使用。 Java 下载 java 安装包&#xff0c;需要登录 oracle&#xff0c;请自行下载。 cd /mnt tar zxvf jdk-8u202-linux-x64.tar.gz配置环境变量到 /etc/bashrc&#xff0c;并执行 source /etc/bas…