ユニティイベントシステムEventSystemブリーフ

関連コンポーネントとクラス

EventSystem


(あなたがこの部分は考慮されていない切り替えることができますので、今だけ1 StanaloneInputModuleので、ゲームのほとんど)の切り替え1.責任InputModule。
InputModuleのアクティブ化および非アクティブ化を担当する2。
3.イベント全体のシステムを担当するダニ。
4.更新InputModule、記録処理デフォーカスマウスの位置。
5.レコードオブジェクトを選択しました。

StandaloneInputModule


1.マウスやタッチ入力イベント、分散イベントの処理します。
2.活性化し、初期化を担当する非アクティブ化(オブジェクトを選択し、位置マウス)を、無効なデータ(オブジェクトの選択、pointerData)をクリーンアップします。
3.入力MonoBehaviourカプセル化、所望のゲーム反転モード、右上隅、左下隅ポイント反応に例えば入力(スイッチング提供する能力を使用して、データを取得するために直接使用されない。そして入る、対応するスクリプトを書き換えときモードスイッチ入力スクリプト缶)。

Raycaster



1.すべてのオブジェクトは、線の検出であることを見つけることは、選挙のイベント配信ソート後の最初のオブジェクトに成功しています。

入力クラス

1.パッケージには、クリック、重力センサーなど、入力情報を取得し、外部に責任があります。
2.BaseInput入力クラスと同じ機能を提供するには、入力切替システムを容易にするために、オブジェクト入力インタフェース名が同じカプセル化されています。

タッチクラス

タッチ1.Touchクラス行動データ(画面上で、タッチ操作者の動作を持ち上げる工程)一定の時間です。
それが含まれている情報の2.Touchタイプ。
三つの部分に分かれています
。<1>開始から終了までの各動作をタッチし、ユニークなIDがある
<2>は、現在の行動がこの段階に触れもので、5段階の合計

    public enum TouchPhase
    {
        Began = 0,//按下
        Moved = 1,//正在移动
        Stationary = 2,//静止,但没有结束
        Ended = 3,//离开
        Canceled = 4//黑屏等其他因素导致的结束
    }

情報<3>現在位置、移動距離。
3.Touchアクションは、ほとんどの場合に始まったことでエンドまたはキャンセル終了を開始しています。
しかし、我々はInput.GetTouchタッチインタフェースを介して情報を取得するためのサイクルにのみ(例えばで更新など)ある時点で、(関連するインタフェースを見つけることができません)修正のタッチ段階を監視する能力を持っていません。そして、完全なタッチ動作FingerId、位相を復元します。しかし、これは、次のような、不完全な可能性がありGetTouchタッチ情報によって得られた問題は、次のようになります
始めた始めた開始GetTouchサイクル呼び出しのドラッグ、そして私たちはタッチを取得することはありません中に1タッチ、および初めまで移動しました。
1フレーム内のフレームの数が少ないと、連続クリック複数回の場合には2が、同じFingerIdタッチが終了することによって終わっていない表示されることがあり、その後、ダイレクトが始まりました。

そのため、入力データとしてGetTouch EventSystem中に得られたデータは、あなたのアカウントにこれらの特別な状況を取る必要があります。

実行プロセス

全体的なプロセス

プロセスフローStandaloneInputModule.Process

以Touch举例

tips:
1.PointerEventData可以理解为对Touch行为的进一步封装,记录了Touch行为信息,如开始位置等,且在此基础上增加了射线检测结果等信息。每一个PointerEventData的生命周期基本上和Touch行为相同。由pressed开始(对应Touch的Began,如缓存中没有对应fingerId的PointerEventData,则新建一个),released结束(对应Touch的Ended或Canceled,从缓存中移除该PointerEventData)。当然对于特殊情况要特殊处理(如上面提到的没有由Began开始的Touch等)。
2.Process主要的工作就是维护PointerEventData的数据,同时根据PointerEventData发出事件。
3.对事件脚本的查找是向上查找的,如C是B的子节点,B是A的子节点。射线检测的结果是C。那么会按C->B->A的顺序去查找可响应该事件的对象。

射线检测流程

这里简单说一下GraphicRaycaster作为举例。

GraphicRaycaster的射线检测

1.GraphicRaycaster是检测同gameobject下canvas中包含的所有Graphic元素是否被射线击中的脚本。
2.Graphic在Onenable,OnDisable,OnBeforeTransformParentChanged,OnTransformParentChanged,OnCanvasHierarchyChanged这几个时间点把自己加入或移除一个以canvas为键值的graphic集合的字典中。
3.具体检测过程:
<1>先从缓存中获取该Canvas下所有的Graphic对象。
<2>处理多显示器问题,先做一波坐标转换。
<3>根据BlockingObjects,对游戏中的3D或2D对象做一次射线检测,保存离相机最近的对象的距离,之后用于对结果的过滤。
<4>先通过RectangleContainsScreenPoint判断射线击中点是否在Graphic的RectTransform中,再通过Graphic自身的Raycast函数进行进一步的检测(检测CanvasGroup,Active状态等)。
<5>最后再做一些测试,如反转剔除,遮挡测试等。

射线检测及排序

1.游戏中所有的Raycaster都进行一次射线检测,获取当前射线击中的所有物体,统一进行排序,选排序后的第一个对象作为射线检测的结果。
2.排序规则
不同Racaster下:
camera.depth
Raycaster.sortOrderPriority 针对ScreenSpaceOverlay
Raycaster.renderOrderPriority 针对ScreenSpaceOverlay
相同Racaster下:
sortingLayer
sortingOrder
depth
distance
index

举例

在手机上按这个方式操作。

其中A上的脚本继承了IPointerEnterHandler,IPointerExitHandler,IPointerDownHandler,IPointerUpHandler,IPointerClickHandler,IDragHandler接口。
B上的脚本继承了IPointerEnterHandler,IPointerExitHandler, IDropHandler接口。
这一系列操作中事件的触发主要依赖于对这几个变量的设置和判定。
①pointerPress:按下时射线击中对象或向上查找的某一挂有继承了IPointerDownHandler或IPointerClickHandler脚本的对象。
②pointerDrag:按下时射线击中对象或向上查找的某一挂有继承了IDragHandler脚本的对象。
③pointerEnter:当前Touch位置发出的射线击中的第一个物体。
④pointerCurrentRaycast:当前位置发出射线的计算结果,包括当前击中的物体等信息。
1.按下
一次完整的touch行为的开始,新生成一个PointerEventData加入缓存中
<1>记录pressPosition,用于开始拖动的判定。
<2>因为当前按下的位置在A上,所以设置pointerEnter为A。且A上的脚本继承了IPointerEnterHandler接口,所以执行A上的PointerEnter函数。
<3>因为当前按下的位置在A上,且A上的脚本继承了IProinterDownHandler、IPointerDragHandler接口,所以设置pointerPress和pointerDrag为A。用于对后续抬起时的Click等事件做判定。同时执行PointerDown函数。
2.拖动
在拖动距离超过Threshold之前什么都不做。超过后开始不停的执行pointerDrag(A)对象上的OnDrag函数。
3.离开A
在离开A时,pointerEnter对象由A变为了null,所以执行pointerEnter(A)对象上的PointerExit函数。
4.拖动
同2。
5.进入B
在进入B时,pointerEnter对象由null变为了B,所以执行pointerEnter(B)上的PointerEnter函数。
6.抬起
touch行为的结束,从缓存中移除这个PointerEventData
<1>执行pointerPress(A)对象上的PointerUp函数。
<2>由于抬起时射线击中的对象是B,而不是pointerPress(A)对象。所以不执行pointerPress(A)对象上的OnClick函数,而执行B上的OnDrop函数。
<3>执行B上的PointExit函数。

小结

1.简单来说EventSysetm的处理过程就是循环获取Touch数据。根据Touch数据来推测完整的Touch行为,来维护对应的PointerEventData,在此基础上进行事件的计算和分发。
2.EventSystem的代码量比较少但特殊处理的地方还挺多的,毕竟一个完善的系统,所有情况都得考虑到位。所以阅读代码时可以先看最核心的Process相关的代码(Touch和Mouse先选一个),像InputModule切换、BaseInput的处理、Touch的特殊情况处理这些可以先略过,把握住核心思路之后再看这些部分。

おすすめ

転載: www.cnblogs.com/blueberryzzz/p/12216045.html
おすすめ