本人是在学习完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上,接下来同样在画布上新建一个文本

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

然后新建一个脚本
拿到我们的玩家物体,和自己的文本,然后获取玩家的血量显示出来
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以来的第一个项目,您也可以尝试自己添加其他元素
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中