Unity-3d小游戏开发-----走迷宫
本人是在学习完c,c++,数据结构算法,操作系统网络这些基础的课程之后,打算学习自己喜欢的游戏开发方向的东西,然后在B站上自学了几天unity,用到unity的触发器,碰撞,刚体,以及一个简单的ui界面,但是本人目前没有c#的学习经验,但是拿c++的经验也能写出一些基础的游戏脚本,这里的参考书籍是《新印象--unity2020游戏开发基础与实战》,适合有一些编程基础的人来观看。
我将从unity的新建项目开始来一步一步的完成这个小游戏
环境为unity2021.3.16 编译器为VS2019
目录
小游戏拆解
首先这个迷宫小游戏大致分为几个逻辑模块
首先问题是我们如何让角色移动起来
还有角色与墙体的碰撞检测
角色吃金币的实现
金币吃完解锁大门
玩家达到指定点结束游戏胜利
角色血量与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以来的第一个项目,您也可以尝试自己添加其他元素
更多推荐
所有评论(0)