打算做一个仿照节奏光剑的游戏,先是花了一晚上找了找解决方案,有一个Openpose还有一个ThreeDPoseTracker,看了看配置好麻烦,而且都太吃配置了,我的1060还想多用几年,所以最后还是买了个Kinect

下面先探究下怎么去实现物体切割,用到了ezy-slice这个插件https://github.com/DavidArayan/ezy-slice

简单的切割

首先摆好场景,一个Plane和两个Cube

然后给Slicer添加代码,并把Cube设为Slice

using System.Collections;
using System.Collections.Generic;
using EzySlice;
using UnityEngine;
public class Slicer : MonoBehaviour {void Start () {}void Update () {Collider[] colliders = Physics.OverlapBox (transform.position, transform.localScale / 2, transform.rotation, LayerMask.GetMask ("Slice"));if (Input.GetKeyDown (KeyCode.D)) {foreach (var collider in colliders) {Destroy (collider.gameObject);//位置与法线获得切割面collider.gameObject.SliceInstantiate (transform.position, transform.up);}}}
}

这样当SlicerCube接触并按下D键,就会切割物体

还可以给生成的切块施加一个方向的力,这样就不会一起掉落

Collider[] colliders = Physics.OverlapBox (transform.position, transform.localScale / 2, transform.rotation, LayerMask.GetMask ("Slice"));
if (colliders.Length > 0) {foreach (var collider in colliders) {Destroy (collider.gameObject);//位置与法线获得切割面GameObject[] objs = collider.gameObject.SliceInstantiate (transform.position, transform.up);//添加刚体并设为凸多面体foreach (var obj in objs) {obj.gameObject.AddComponent<Rigidbody> ();obj.gameObject.AddComponent<MeshCollider> ().convex = true;}//施加力objs[0].gameObject.GetComponent<Rigidbody> ().AddForce (transform.up * 100);objs[1].gameObject.GetComponent<Rigidbody> ().AddForce (-transform.up * 100);}
}

给切割面添加材质

public Material sliceSurface;
//省略
Collider[] colliders = Physics.OverlapBox (transform.position, transform.localScale / 2, transform.rotation, LayerMask.GetMask ("Slice"));
if (colliders.Length > 0) {foreach (var collider in colliders) {Destroy (collider.gameObject);//位置与法线获得切割面SlicedHull hull = collider.gameObject.Slice (transform.position, transform.up);if (hull != null) {GameObject upper = hull.CreateLowerHull (collider.gameObject, sliceSurface);GameObject lower = hull.CreateUpperHull (collider.gameObject, sliceSurface);GameObject[] objs = new GameObject[] { upper, lower };foreach (var obj in objs) {//添加刚体并设为凸多面体obj.gameObject.AddComponent<Rigidbody> ();obj.gameObject.AddComponent<MeshCollider> ().convex = true;}//施加力objs[0].gameObject.GetComponent<Rigidbody> ().AddForce (transform.up * 100);objs[1].gameObject.GetComponent<Rigidbody> ().AddForce (-transform.up * 100);}}
}

使用DoTween制作动画

节奏光剑的物块都是从玩家面前出现的,所以先简单地做一个物体从前方出现并移动到玩家面前的动画

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
public class CubeManager : MonoBehaviour {public GameObject cubePb;public Transform[] originTrans;public Transform[] targetTrans;void Start () {InvokeRepeating ("creatCube", 0, 2f);}void Update () {}void creatCube () {int random = Random.Range (0, 2);GameObject gb = Instantiate (cubePb, originTrans[random].position, cubePb.transform.rotation);gb.transform.DOMove (targetTrans[random].position, 5).OnComplete (delegate () {//播放完动画后销毁Destroy (gb);});}
}

效果

美化

再使用这个插件做一个简易的光剑

https://assetstore.unity.com/packages/tools/particles-effects/volumetric-lines-29160

还可以添加切割特效

切割的优化

四个切割方向

向左下右上移分别是 1,2,3,4,然后在update里面调用

void setMoveDir () {moveDir = 0;Vector3 dir = transform.position - lastPos;//分别是 左移 下移 右移 上移if (dir.x < 0) {moveDir = 1;}if (dir.y < 0) {moveDir = 2;}if (dir.x > 0) {moveDir = 3;}if (dir.y > 0) {moveDir = 4;}
}

由于切割时要根据一个点和轴来确定切割面,而这个光剑应该是各个方向都是开刃的,轴不好确定,所以还是把切割方法写在被切割的物体身上

放置一个空物体到中心偏前的位置,根据这个物体来切割物块

public void slice () {//位置与法线获得切割面SlicedHull hull = gameObject.Slice (slicePoint.position, slicePoint.right);if (hull != null) {GameObject upper = hull.CreateLowerHull (gameObject, sliceSurface);GameObject lower = hull.CreateUpperHull (gameObject, sliceSurface);GameObject[] objs = new GameObject[] { upper, lower };foreach (var obj in objs) {//添加刚体并设为凸多面体obj.gameObject.AddComponent<Rigidbody> ();obj.gameObject.AddComponent<MeshCollider> ().convex = true;}}Destroy (gameObject);
}

最后让它能够朝四个方向旋转

void setAllowDir () {allowDir = Random.Range (1,5);transform.Rotate (Vector3.forward * 90 * allowDir, Space.Self);
}

效果

视觉优化

由于默认的Cube添加贴图六个面都会加上,但是我又不会用建模工具,所以使用Probuilder工具让物块只有一个面有箭头

找了个箭头的资源https://github.com/764424567/Unity-plugin/tree/master/Menu/Unity3D-ArrowImg

然后使用Probuilder建一个立方体,进入Material编辑面板选择要编辑的面更改Material即可

然后再随便弄个场景

使用Koreographer音游插件

装好Koreographer插件后分别创建这两个资源

需要音频文件,然后定义EventID

之后通过编辑窗口在音乐对应的时间点添加事件,图上每一小段是0.5s,而我们又是“下落式”的音游,关键点是根据物块最终的位置打的,所以设定好物块从起点到终点的移动时间还要将此处的时间点统一前移n秒,比如我物块的移动时间是2s,所以这里就统一前移了2s

给物体添加KoreographerSimpleMusicPlayer两个组件

在同样的物体上添加脚本

public class MusicManager : MonoBehaviour {public float offsetTime; //偏移时间public string eventID; //事件IDpublic GameObject cubePb;public Transform originTrans;public Transform targetTrans;void Start () {Koreographer.Instance.RegisterForEvents (eventID, AddCubeEvent);}void AddCubeEvent (KoreographyEvent koreoEvent) {GameObject gb = Instantiate (cubePb, originTrans.position, cubePb.transform.rotation);gb.transform.DOMove (targetTrans.position,offsetTime).OnComplete (delegate () {//播放完动画后销毁Destroy (gb);}).SetEase (Ease.Linear);}
}

优化1

Cube添加刚体和碰撞体,给Slicer添加碰撞体,重新把检测切割的方法写到OnCollisionEnter

void OnCollisionEnter (Collision other) {if (other.gameObject.layer == LayerMask.NameToLayer ("Slice")) {if (moveDir == other.gameObject.GetComponent<MoveCube> ().allowDir) {effect.GetComponent<ParticleSystem> ().Play ();other.transform.GetComponent<MoveCube> ().slice ();}}
}

看下最后的效果,虽然没有音乐,不过物块都是根据音乐节拍生成的

使用InfiniteRunner生成无限地形

https://assetstore.unity.com/packages/templates/systems/2d-3d-infinite-runner-engine-51328

这个插件是一些跑酷类游戏的原型,插件中也有各种应用场景的demo,不过我只需要用到无限连接的地形生成就行了

先随便整两个平面

然后添加这几个脚本

其中

  • LinkedSpawnedObject说明这是个Linked类型(可以连接)的物体,In和Out分别是连接的头和尾,这样在生成物体时就会自动帮我们把当前物体和前一个物体的尾连接起来
  • PoolableObject表示这是一个对象池的物体
  • MovingObject来让物体移动
  • OutOfBoundRecycle可以确定物体在距离回收范围多远后被回收

然后给一个物体添加MultipleObjectPoolerLinkedSpawer两个脚本,前者是对象池的设定,后者用来生成Linked类型的物体

然后在另外一个物体上添加LevelManager脚本,然后在场景中编辑RecycleBoundsDeathBounds的范围

最后简单的效果就像这样

优化2

场景

我又在资源商店里找到个音乐可视化的地形https://assetstore.unity.com/packages/vfx/particles/spells/living-particles-105817

以下是其中一个场景

这个场景也是一个个方形区域,正好用上面的InfiniteRunner可以生成无限连续的场景

人物

搭配一个UnityChan的模型,并试给两个“光剑”设定手部为父物体

void Start () {if (leftHand != null) {transform.SetParent (leftHand);}if (rightHand != null) {transform.SetParent (rightHand);}transform.localPosition=Vector3.zero;
}

现在的样子

而今天我的Kinect也终于到货了

摄像头视角是这样的

接下来的任务就是学习Kinect的使用,如何把现实中人的动作和模型绑定起来

使用kinect

要想在unity配合kinect开发需要安装SDK和相应的插件

首先在微软官方安装kinectSDKhttps://developer.microsoft.com/zh-cn/windows/kinect/

安装后也可能出现各种问题,比如USB3.0,切换独显,省电模式等等,比如我的KinectStdio界面帧率就很低,但是录视频和在游戏里并不卡顿,也不知道是什么问题

KinectStdio界面

安装好SDK后,就要装unity插件https://assetstore.unity.com/packages/3d/characters/kinect-v2-examples-with-ms-sdk-18708

这个插件里面包含了各个场景的示例,稍微改改就能直接用

由于暂时还不知道怎么修改模型(用之前的unity酱试了试效果不太理想),所以我直接把示例场景里的模型和必要的物体复制到我的音游场景里

连接kinect运行场景,下面就是目前的样子,已经具备可玩性了,就是操作有点蹩脚

Unity搭配Kinect制作仿节奏光剑的游戏相关推荐

  1. Unity引擎制作仿《文明》游戏

    首先要说的是为什么要仿<文明>而不是其他什么么的仿雷电.RPG此类. 第一点,游戏制作室自发性质,所以要选热爱的游戏类型,这样才有动力做下去.我所热爱的游戏,而且不能这么宏伟,可以想到的是 ...

  2. 【游戏开发实战】使用Unity 2019制作仿微信小游戏飞机大战(七):主角飞机碰撞与爆炸

    文章目录 零.教程目录 一.前言 二.本篇目标 三.飞机机碰撞组件:BoxCollider2D.Rigidbody2D 四.添加Tag:Enemy 五.主角飞机碰撞处理:OnTriggerEnter2 ...

  3. unity课设小游戏_Unity制作20个迷你小游戏实例训练视频教程

    本教程是关于Unity制作20个迷你小游戏实例训练视频教程,时长:20小时,大小:3.8 GB,MP4高清视频格式,教程使用软件:Unity,附源文件,作者:Raja Biswas,共97个章节,语言 ...

  4. 在Unity中制作4种不同的游戏

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:8.6 GB 含课程素材 |时长:15h ...

  5. 3张硬纸板DIY《节奏光剑》全身追踪器,免费开源可替代淘宝3000元套件

    博雯 发自 凹非寺 量子位 报道 | 公众号 QbitAI 安上3张硬纸板后,不忍直视的壮汉撒娇立马对味儿了: 没错,就是这样平平无奇的纸板: 这样一个看上去分分钟就能DIY出来的纸板,居然能用来捕捉 ...

  6. Unity 4 3 制作一个2D横版射击游戏 2

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在上一篇 ...

  7. swiftui动画之tab自定义切换动画_Unity动画系统详解1:在Unity中如何制作动画?

    摘要:在场景中加入动态的物体,可以让整个场景更加生动.真实.Unity场景中的物体可以通过制作动画,让物体动起来.简单的动画如物体的移动.旋转(比如旋转的风扇.闪烁不定的灯泡等),复杂的动画如游戏中角 ...

  8. Unity动画系统详解1:在Unity中如何制作动画?

    摘要:在场景中加入动态的物体,可以让整个场景更加生动.真实.Unity场景中的物体可以通过制作动画,让物体动起来.简单的动画如物体的移动.旋转(比如旋转的风扇.闪烁不定的灯泡等),复杂的动画如游戏中角 ...

  9. html怎么实现聊天界面设计,纯css制作仿微信聊天页面

    纯css制作仿微信聊天页面 *{ margin: 0; padding: 0; } body{ font-size: 14px; } .triangle{ margin: 100px auto ; w ...

最新文章

  1. 使用 JavaCSV api 读取和写入 csv 文件
  2. 华为mate x2什么时候更新鸿蒙系统,华为Mate X2真机发布,今年四月可升级鸿蒙系统...
  3. 【c语言】蓝桥杯算法训练 4-2找公倍数
  4. python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务
  5. C++STL 常用 函数 用法
  6. 使用PowerShell 链接Azure 查看信息
  7. 光端机的使用注意事项详解
  8. 彩虹系统怎么弄服务器,用云服务器彩虹挂机
  9. 点云3D目标检测学习(1):pointnet、pointnet++模型
  10. linux开机自启动python脚本_Linux下Python脚本自启动和定时启动的详细步骤
  11. android学习笔记---手机拍照功能的实现,及原理
  12. SilverLight客户端搭建完善聊天室 测试网址swkzy.vicp.net
  13. 5分钟搭一个FastDFS--Linux篇
  14. VMware -- 安装linux镜像
  15. 工程造价步骤_史上最全造价工作流程,全了
  16. R语言和Python的区别
  17. Python全栈最全学习之路-Python基础(十一)
  18. matlab gui双音拨号,电子信息毕业设计---双音多频拨号系统的MATLAB仿真实现
  19. MySQL第六讲 MySQL分库分表方案
  20. Transact -SQL 语句

热门文章

  1. 校园服务APP使用体验
  2. 校园智能铃声软件《校园小助手软件》Ver2.4.4
  3. 2022汇佳学校IB成绩再创新高:均分37.1,文凭通过率100%!
  4. 张飞硬件设计与开发 第二部
  5. html5手机页面测试,HTML5 页面测试
  6. 《魔兽世界》AI数据表脚本函数[转]
  7. 站外seo优化有用吗?值得投入时间和精力吗?
  8. 云原生容器平台的容灾
  9. 群晖手机端看视频用什么套件_动手看一下SparkFun的新眼镜套件
  10. dpcm 量化 matlab,DPCM和PCM系统的量化噪声与matlab实现