XboxOne的kinect在Unity上的开发——开始界面

2023-11-12

好的,欢迎大家来看这个系列的第二部分的内容,这一次呢,我们就直接进入主题,开发切水果游戏本身。

这次的切水果的demo呢,我们选择使用ugui来制作,因为ugui相对于NGUI的各种优势,让我们选择了ugui,关于这些呢,大家可以参考我的另一篇帖子,关于NGUI与ugui的对比。

NGUI与ugui的对比

首先,我们需要搭建一个游戏的开始界面,,选择建立一个panel,。建立panel的同时,我们也会自动创建一个canvas,并且panel也会在他之下,我们把panel改名为indexpanel,方便辨识。在这个panel下面新建一个image图片,图片选择我们的背景图。然后我们再分别建立三个按钮,按钮的话我们使用一个空物体里面套入两个图片,一个水果一个圆环这样的设计。


以这样的方式我们建立好3个按钮,作为主界面的三个按钮。

但是按钮如果只是这样就显得有些单调了,所以我们可以让圆环的图片旋转起来。我这次使用的是Unity的动画控制器进行旋转,并没有选择使用ugui的dotween的插件。

首先,我们给圆环的图片添加新的动画组件,Animator组件 。我们再添加一个动画控制器,起名为Start_Circle_Contral ,我们把这个动画控制器拖到animator组件里,作为这个圆环的动画控制器。光有动画控制器还不够,所以我们还需要建立一个动画片段,没有动画片段,光有控制器一样是无法播放动画的。动画片段起名为Start_Circle_Rotation,,打开动画控制器编辑,我们把这个动画片段拖进去,作为默认的动画,并且,我们把右边的loop给勾选上,让他进行循环的播放。我们在打开动画的编辑器,选择进行添加,再选择rotation,也就是旋转。

右边我们选择曲线模式

时间0的时候我们把Z轴的旋转角度设为0,根据我的调整,选择10秒后的Z轴数值为360,也就是每10秒转一圈,这个速度的话,是比较理想的。我们也可以点击播放,看一下效果,按照自己的喜好调整。

这样,我们的界面也就基本完成了,但是,这只是一个界面,并没有与kinect相连和互动。此时我们建立一个rawimage作为kinect显示我们人体的图片,可以不进行图片拖入,直接选择白色就行。我们给它改名为KinectImg。然后我们给它添加一个canvas group脚本,这样我们就可以调节它的透明度了。

我们再添加一个image,作为我们的右手,这样就可以表示我们的右手所在的位置了。图片也可以按照自己的喜好来做。

最后,我们给indexpanel添加一个脚本,用来控制我们的这个场景。

首先在脚本里我们要获取一些变量

    public Canvas canvas;//父级canvas
    public Image rightHand;//右手图片
    public Sprite[] handStateSprites;//图片数组

    public Image btn1;按钮
    public Image btn2;
    public Image btn3;

    public Image circle1;圈
    public Image circle2;
    public Image circle3;
获取这些变量以后,我们就可以开始内部逻辑的编写了。

第一步,我们首先要获取玩家,也就是要检测到玩家。我们在update中编写。

if (KinectManager.Instance.IsJointTracked(userId, jointType))
            {
                //关节点被追踪到
                Vector3 handPos = KinectManager.Instance.GetJointKinectPosition(userId, jointType);//获取左手信息
                Vector3 handScreenPosV3 = Camera.main.WorldToScreenPoint(handPos);//右手转换到屏幕坐标
                handScreenPosV3 = Utils.Rec(KinectInterop.JointType.HandRight);
                Vector2 handSenPos = new Vector2(handScreenPosV3.x, handScreenPosV3.y);
                Vector2 uguiPos;
                //执行屏幕坐标到UGUI左边的转换
                bool changeSucess = RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)canvas.transform, handSenPos, Camera.main, out uguiPos);

                if (changeSucess)
                {
                    //表示右手在canvas所表示的矩形范围内
                    RectTransform rightRectTf = rightHand.transform as RectTransform;
                    rightRectTf.anchoredPosition = uguiPos;//更新鼠标图标
                }
}
这样就是表示我们获取到玩家的骨骼关节点了。接下来我们就可以判断玩家的手型了,我们用握拳来表示点击。
bool isHandClose = false;
                rightHand.sprite = handStateSprites[0];
                KinectInterop.HandState rightHandState = KinectManager.Instance.GetRightHandState(userId);
                if (rightHandState == KinectInterop.HandState.Closed)
                {
                    //右手握拳了
                    isHandClose = true;
                    rightHand.sprite = handStateSprites[1];
                }

这样就是表示我们已经握拳了,也就是做出了点击的动作。但是我们需要点击的是按钮,所以要判断是否在按钮上,或者不在,我们以圆圈为按钮(因为圆圈范围相对水果较大)。

if (isHandClose==true)
                {
                    //握拳了,然后再看是否有跟三个按钮重合
                    if (circle1.enabled==true&& RectTransformUtility.RectangleContainsScreenPoint(circle1.rectTransform, handSenPos, Camera.main))//检测到点在rect里面的时候才会返回true
                    {
                        //点击了第一个按钮
                        hanClickFruit(btn1);
                    }
                    else if (circle2.enabled == true && RectTransformUtility.RectangleContainsScreenPoint(circle2.rectTransform, handSenPos, Camera.main))//检测到点在rect里面的时候才会返回true
                    {
                        //点击了第二个按钮
                        hanClickFruit(btn2);
                    }
                    else if (circle3.enabled == true && RectTransformUtility.RectangleContainsScreenPoint(circle3.rectTransform, handSenPos, Camera.main))//检测到点在rect里面的时候才会返回true
                    {
                        //点击了第三个按钮
                        hanClickFruit(btn3);
                    }
                }  


这样我们就可以知道切到了那个水果了,但是现实游戏中,当我们切中水果之后会有一个向上的飞行动作之后再下落,我们也要实现以下这个效果。所以我给每个水果的图标都添加了刚体,但是默认的刚体重力比例设为0,这样就不会掉落了。

/****切到水果的处理函数****/
    private void hanClickFruit(Image clickFruit)
    {
        Rigidbody2D r1 = btn1.GetComponent<Rigidbody2D>();
        Rigidbody2D r2 = btn2.GetComponent<Rigidbody2D>();
        Rigidbody2D r3 = btn3.GetComponent<Rigidbody2D>();

        r1.gravityScale = gravityScale;
        r2.gravityScale = gravityScale;
        r3.gravityScale = gravityScale;

        circle1.enabled = false;
        circle2.enabled = false;
        circle3.enabled = false;

        curBtn = clickFruit;//记录当前是那个水果
}
获取了切中的水果,以及他们的刚体组件。接下来就可以赋予效果了。但是我们同样需要一些变量。

private Image curBtn;//记录被切中的水果,希望知道水果何时出界,出界时再切换
public int curBtnOutY = -300;//小于这个值为出界
public int upForce = 800;
public int gravityScale = 10;
我们可以赋予被切中的水果做向上运动之后掉落,其他的则直接掉落,掉落后出屏幕外时进行销毁。

if (clickFruit==btn1)
        {
            r1.AddForce(new Vector2(0, upForce));
        }
        else if (clickFruit==btn2)
        {
            r2.AddForce(new Vector2(0, upForce));
        }
        else
        {
            r3.AddForce(new Vector2(0, upForce));
        }
我们可以使用if和else if来判断,也可以用switch。

接下来就是判断出界了,超出屏幕时销毁,因为水果被赋予了刚体,所以重力会使水果向下掉落,我们只需要判断Y轴小于某个值就可以了。判断的话,需要我们放在update里进行每帧检测。


具体方法如下。

//执行检测什么时候水果出界
    private void deteCurBtn()
    {
        if (curBtn!=null)
        {
            RectTransform rtf = curBtn.transform as RectTransform;//获取当前水果属性
            if (rtf.anchoredPosition.y<curBtnOutY)
            {
                //被切中水果出界
                panelCenter.showGamePanel();
                Destroy(gameObject);
            }
        }
    }


以上就是这次的开始界面的开发,下一期我会介绍游戏界面的制作。


第一期:

http://blog.csdn.net/Iwilreal/article/details/78516838


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XboxOne的kinect在Unity上的开发——开始界面 的相关文章

  • 异步提交或回滚事务范围

    正如许多人所知 TransactionScope当async await Net 中引入了模式 如果我们尝试使用一些它们就会损坏await在事务范围内调用 现在这个问题已经解决了 感谢范围构造函数选项 a 17527759 1178314
  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 以编程方式获取命名管道的系统名称

    我正在使用 WCF NetNamedPipeBinding 编写进程间通信 我的目标是让服务在 net pipe localhost service 上运行 所以我运行最简单的主机 host new ServiceHost contract
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • C++ - 错误 C3646:未知的覆盖说明符

    我修改了我的项目 编译后弹出一些奇怪的错误 ifndef BART RAY TRACER MESH H define BART RAY TRACER MESH H include
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 如何将 int.TryParse 与可为空的 int 一起使用? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 TryParse 来查找字符串值是否为整数 如果该值为整数 则跳过 foreach 循环 这是我的代码 string strValue 42 if int TryParse trim strVal
  • MPI_Gather 分段错误

    我有这个并行高斯消除代码 调用以下任一方法时会发生分段错误MPI Gather函数调用 我知道如果没有为任一缓冲区正确分配内存 可能会出现此类错误 但我看不出内存管理代码有什么问题 有人可以帮忙吗 Thanks Notes 该程序从一个 t
  • 清理 STL 指针列表/向量

    您可以想出的最短的 C 块是多少来安全地清理std vector or std list指针 假设您必须对指针调用删除 list
  • esp8266互联网交换机问题

    我正在尝试制作一个门继电器开关系统 我可以通过端口转发从任何地方进行操作 我找到了一个非常有用的指南和代码 我的程序基于 https openhomeautomation net control a lamp remotely using
  • 三元运算的结果(类型)是什么?

    三元运算是否返回副本或引用 我检查了以下代码 vector
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • Web API 2 中的方法名称约定 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有 Web API 2 中使用的约定的列表 以这两种方法为例 两者都可以工作 但都没有用属性来装饰 IHttpActionResu
  • if(pointerVar) 与 if(pointerVar!=NULL) 相同吗?

    简单的问题 Is if pointerVar 与if pointerVar NULL 也是if pointerVar 与if pointerVar NULL 给我你在技术上最正确 迂腐的答案 这两种说法看起来和操作起来都是一样的 前者有什么
  • 我们还需要迭代器设计模式吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如果未先将 lambda 表达式强制转换为委托或表达式树类型,则无法将其用作动态分派操作的参数

    我正在使用 NET4 5 和 VS2013 我有这个查询dynamic来自数据库的结果 dynamic topAgents this dataContext Sql select t create user id as User sum t
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 隐藏 MediaPlayer 控件(Microsoft 媒体平台播放器框架)

    我在 c xaml 应用程序中使用 MMP PF 提供我自己的控制元素来处理播放器 这就是为什么我想隐藏 禁用出现在底部的本机控件 在屏幕截图的屏幕中间 这只是使用了一个主题 有人知道该怎么做吗 我没能找到合适的房产 像这样使用 axWin
  • C++ 中带逗号的表达式的执行顺序 [重复]

    这个问题在这里已经有答案了 我的理解是这个词j i将在之前执行 i在声明中 j i i C 标准是否保证j i将在之前执行 i在循环 for auto i std next begin j begin i end j i i 逗号运算符引入

随机推荐

  • 操作系统实验 - 题目二 进程调度算法的实现

    2 1 题目的主要研究内容及预期达到的目标 设计目的 理解进程调度相关理论 掌握时间片调度原理 掌握高优先级调度原理 课题描述 本课题主要针对操作系统中进程调度相关理论进行设计 要求编写程序并进行测试 该程序可以对多个进程进行调度 调度算法
  • 常用公差配合表图_机械设计公差与配合及其标注方法

    一 公差与配合的概念 一 零件的互换性 在成批生产进行机器装配时 要求一批相配合的零件只要按零件 图要求加工出来 不经任何选择或修配 任取一对装配起来 就能达到设计的工作性能要求 零件间的这种性质称为互换性 零件具有互换性 可给机器装配 修
  • linux性能命令详解

    1 查看进程相关信息 1 1 查看当前进程 查看当前进程的启动命令 PID为线程ID 1 ps ef grep 进程信息 获得进程PID 2 cd proc PID 3 ll proc PID 显示的文件夹 cwd符号链接的是进程运行目录
  • feign GET请求不支持对象传参的坑

    问题 GetMapping getByParam String hello Student student throws Exception 如上 feign调用报错500 解决方法 增加 SpringQueryMap GetMapping
  • xxx is not in the sudoers file.This incident will be reported错误

    一 问题解决 在执行sudo命令时会有如下提示 xx is not in the sudoers file This incident will be reported 原因分析 一般这种情况是创建了新用户 没有对应修改sudoers文件或
  • 【文件上传绕过】八、::$DATA上传绕过

    文章目录 一 利用Windows特性 二 源码 三 使用burpsuite抓包在文件后缀加 DATA绕过 一 利用Windows特性 在window的时候如果文件名 DATA 会把 DATA之后的数据当成文件流处理 不会检测后缀名 且保持
  • Myeclipse中Properties文件Unicode码或乱码解决方案

    打开myeclipse的 Window gt Perferences gt General gt Editors gt Context Types 或者 Window gt Perferences gt General gt Context
  • 6. 微积分 - 函数

    Hi 大家好 我是茶桁 经历了前面5节课的基础之后 不知道大家感觉怎么样 我后台接收到了一些反馈 有的同学说比较简单 有的同学说正合适 那有的同学呢 就觉得有些绕 一时之间可能没办法理解和接受 说明小伙伴们的水平呢 还是有一些参差不齐的 那
  • 兔子生兔子的Java解决方式

    最近在学python 其中有这样一道题 古典问题 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问每个月的兔子总数为多少 没有做出来 先用笔在纸上算的时候也是稀里糊涂的 后来想办法
  • python -- opencv获取摄像头时,运行一段时间后突然停止

    问题 在pycharm社区版中 使用opencv获取摄像头时 运行一段时间后 rtsp流突然断开 有概率 断开时报错 websockets exceptions ConnectionClosedError code 1006 connect
  • Spring Boot中解析JSON数据的三种方案

    文章目录 1 JSON简介 2 Spring Boot默认的JSON解析 2 1 使用示例 2 2 修改特定数据的全局JSON格式 2 2 1 自定义MappingJackson2HttpMessageConverter 2 2 2 自定义
  • 假设检验(一):假设检验总体概念

    写在前面的话 最近在学习统计学 这里仅仅是一些学习笔记 方便我自己回顾以及供大家参考 对于统计学我只是初学者 有什么错误之处欢迎大家指出 共同学习 共同进步 一 总体概念 假设检验是一种统计推断方法 其主要用来判断样本与样本 样本与总体之间
  • 使用hiredis实现publish和subscribe

    publish include
  • 提权_Linux提权_suid

    1 MSF连接目标机 生成msf后门 上传到目标机 开启监听 等待运行 gt msfvenom p linux x64 meterpreter reverse tcp LHOST 0 0 0 0 LPORT 6666 i 3 f elf o
  • SylixOS lite Extension工程开发手册

    1 适用范围 本文档介绍了SylixOS Lite版本应用工程的开发流程 适用于使用SylixOS Lite版本开发的相关工程师 2 新建Extension工程 1 选择创建Extension工程 在Project Explorer栏中点击
  • iview表格全选禁止选中设置

    业务需求 表格里面一键全选功能 但是有些数据可能不满足全选的需求 当点击全选时 不满足条件的默认不认其选中 代码如下
  • 微信小程序切片-喝水了关于我们前端制作演示

    微信小程序切片 喝水了关于我们前端制作演示 外部背景的使用 文字识别的使用 复制粘贴设置 边框的设置方法 原始高清播放文件 链接 https pan baidu com s 1nOeOoCj1jfP5rQOg UaQDQ 提取码 32lt
  • Mysql报错 Error querying database. Cause java.sql.SQLSyntaxErrorException

    今天写一个查询功能的时候 出现了一个错误 当我写好后端接口 准备去前端掉用的时候出现了如下错误 Errorqueryingdatabase Cause java sql SQLSyntaxErrorException Youhaveaner
  • leetcode——第55题——跳跃游戏

    题目 给定一个非负整数数组 nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 class Solution public bool canJump vector
  • XboxOne的kinect在Unity上的开发——开始界面

    好的 欢迎大家来看这个系列的第二部分的内容 这一次呢 我们就直接进入主题 开发切水果游戏本身 这次的切水果的demo呢 我们选择使用ugui来制作 因为ugui相对于NGUI的各种优势 让我们选择了ugui 关于这些呢 大家可以参考我的另一