unity3d改变物体的中心位置_【unity3d模块总结】-2D虚拟手柄

f2eb5418ee0fa968c21909fee3de3902.png

【前序】

那么,首先各位2019新年快乐吧。跨年之际,一位学土木的业余游戏程序员,在这里为大家带来他的第一篇文章(并希望以后就把知乎当作自己博客算了)。知乎的App做的倒是挺不错的说,博客写在这里可以随时在手机上看到,而且突然发现自己竟然注册过(虽然也被推荐过去CSDN一类的专业IT站去写博客),嘛不过既然注册了知乎能用就用便是了,博客又不是非得写给谁看得,更多的是为自己写的就是了。而且其实我也不是专攻编程软件开发方面的,一方面是被分到了土木专业,更多的是有一个成为全栈独立游戏制作者的梦想(或者说努力挣扎的方向),比起那些专业的IT站或许知乎这里更适合分享各方面的知识。相信这里也有一些真正想学技术的人,嘛也不乏一些吃瓜的人,不过都欢迎评论就是了,大家一起笑着讨论知识便是

【2D虚拟手柄】

首先来说说2D虚拟手柄吧。就是你玩碧蓝航线的时候左下角的那个控制舰娘方向的手柄。也是你玩第五人格,手游吃鸡的时候左下角那个控制方向的手柄

2D虚拟手柄个人给予它的定义是:在手机游戏中,通过触摸并滑动,在以初始触摸点为中心参考,结合当前滑动的触摸点,以完成对于方向的控制的一种实现方式

它的原理基于实体手柄中的摇杆所设计

以下对于如何实现虚拟手柄进行泛型的大致方法总结,以及如何在unity3d中实现虚拟手柄进行详细的阐述

【定义与揭示】

以下对于【2D虚拟手柄】的一些相关概念进行个人的定义和解释,引入一些新的定义名词,以便更好的,详细的阐述【2d虚拟手柄】

----【锁定式】【非锁定式】:这是两种【2d虚拟手柄】的常见分类形式,区别在于【2d虚拟手柄】是否被固定在一个位置并处于始终可见的状态(【锁定式】),还是在一定的范围内,当你摁下时以你的初始触摸点为中心生成手柄(【非锁定式】)

6c4b9e4047b4353848a3c60ae91d181b.png

----【触摸点】:即用户手指触摸手机屏幕并滑动的过程中,手指的当前位置

----【参考中心】:通过与【触摸点】进行相应的运算,来完成【2d虚拟手柄】主要功能的一个重要的中心参考位置。无论何时【手柄圆】都应以【参考中心】为圆心。【锁定式】中的锁定也是【参考中心】的锁定,而【非锁定式】中,则以用户当前摁下时的初始触摸位置为参考中心来生成手柄

---- 【触点圆】:【2d虚拟手柄】中反应当前触摸位置的一个圆形,用于告知操作者当前的触摸相对位置。但【触点圆】的位置应被限制在【手柄圆】中,即当前若【触摸点】在【手柄圆】中,【触点圆】的位置就是【触摸点】的位置,若当前【触摸点】不在【手柄圆】中,【触点圆】的位置应是【触摸点】相对【参考中心】的向量与【手柄圆】边界相交的位置

----【手柄圆】:【2d虚拟手柄】中以【参考中心】为圆心,一定半径的一个大圆形。用于限制【触点圆】,也对于实现【2d虚拟手柄】的相关功能有一定的作用

----【启发域】:即【2d虚拟手柄】接受用户初始触摸输入的一个限制范围,由于不可能将整个触摸屏的范围都交由【2d虚拟手柄】来使用,因此【2d虚拟手柄】的触摸接收就需要设置一定的初始触摸接收范围。在捕捉到一个符合要求的【触摸点】后,将其传入【2d虚拟手柄】的接收方法中,并对其进行持续的“关注”,以其对应的当前【触摸点】结合【参考中心】进行相应的运算,以完成【2d虚拟手柄】相应功能的实现。在【锁定式】中【启发域】就是【手柄圆】,在【非锁定式】中【启发域】则是一个屏幕内的限制范围

【unity3d的实现】

那么终于到了万众期待的实现环节,且听我慢慢道来其结合【unity3d】引擎的实现方法

好吧其实代码早就写好了,也被用在了其他许多项目中了,只是一直没有好好总结一下,并整理出一个可用的Package罢了,下面也是进行了一些总结和更正

以下是对于【非锁定式】的实现,完成后其实插入一个Flag变量并区分一下OnPointerDown中的触摸位置,以及在抬起和摁下时一些方法就可用自然的完成【锁定式】了

首先先让我们看看场景中需要的对象和的层级关系

>【启发域】用一个Panel来实现并自然作为画布的子对象

>>【手柄圆】用一张Image并作为【启发域】Panel的子对象

>>>【触点圆】用一张Image并作为【手柄圆】Image的子对象

之后是要求RectTransform中的锚点为x y 均拉开且Left Right Top Bottom数据均为0,如下图中的Panel锚点设置

036f068f3986cce4827d040327cce4e1.png

这里是要用到UnityEngine.EventSystems;中的一些接口,来完成对于【触摸点】的捕捉·,那么自然脚本就需要挂在【启发域】的那张Panel上,让我们创建一个名为Button_Handle的脚本并挂在Panel上吧

之后进入脚本环节

首先让我们先引入命名空间,并实现几个需要被使用到的接口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Button_Handle :  MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler, IBeginDragHandler
{
    
//接口
	public void OnBeginDrag(PointerEventData
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值