UGUI系统--事件系统架构之光线投射模块_04

--------------------------------------Raycast相关----------------------------

------------------光线投射结果---------------

1 光线投射的对象
2 光线投射的模块
3 光线投射的距离,深度,层,层内号,
4 光线投射的世界坐标,世界坐标法线,屏幕坐标
5 检测光线投射结果是否有效
6 清空光线投射

public struct RaycastResult
{
    private GameObject m_gameObject;
    public GameObject gameObject
    {
        get{return m_gameObject;}
        set{m_gameObject=value;}
    }
    
    
    public BaseRaycaster module;
    public float distance;
    public float index;
    public int depth;
    public int sortingLayer;
    public int sortingOrder;
    
    public Vector3 worldPosition;
    public Vector3 worldNormal;
    public Vector2 screenPosition;
    
    public bool isValid{
        get{return module!=null&&m_gameobject!=null}
    }
}

------------------光线投射管理器--------------

1 对所有光线投射类进行注册移除注册
2 获取所有光线投射

internal static class RaycasterManager

private static readonly List<BaseRaycaster> s_Raycasters = new List<BaseRaycaster>();

public static void AddRaycaster(BaseRaycaster baseRaycaster);

public static List<BaseRaycaster> GetRaycasters()

public static void RemoveRaycaster(BaseRaycaster baseRaycaster) 


-----------BaseRaycaster射线碰撞检测基类--------

1 光线投射基类

2 光线投射相机 光线检测碰撞,层号,渲染号

public abstract class BaseRaycaster : UIBehaviour

public abstract void Raycaster(PointerEventData eventData,List<RaycastResult> resultAppendList)

public abstarct Camera eventCamera{get;}

public virtual int sortOrderPriority

public virtual int renderOrderPriority

public string ToString()

--------------------检测Graphic类型对象的射线碰撞------------------

1 Canvas需要和GraphicRaycaster同时存在,通过不同的Canvas将Graphic进行存储

2 类GraphicRegistry中只读字段 private readonly Dictionary<Canvas,IndexSet<Graphic>> m_Graphics
中以Canvas为组将Graphic对象进行分别存储,以便获取每个Graphic对象

3 GraphicRegistry中提供静态函数 RegisterGraphicForCanvas,UnregisterGraphicForCanvas
,GetGraphicsForCanvas对Canvas下的Graphic进行管理

4 在Raycast方法中检测射线的碰撞时使用反射获取类的实例方法这个点需要注意,其次使用unity中不常用的
类创建委托 
UnityEngineInternal.ScriptingUtils.CreateDelegate(typeof(RaycastAllCallback), raycastAllMethodInfo);


public class GraphicRaycaster:BaseRaycaster

属性
1 Canvas canvas{get;}  //获取Canvas组件
2 int sortOrderPriority //获取Canvas的分类层级顺序
3 int renderOrderPriority //获取渲染层级顺序
4 bool ignoreReversedGraphics //是否忽略反面的事件检测
5 public override Camera evnetCamera  //获取光线投射的事件相机
6 public BlockingObjects blockingObjects //设置碰撞检测的是2d,3d还是两者都检测

字段
protected LayerMask m_BlockingMask = kNoEventMaskSet; //设置射线碰撞检测的层
private List<Graphic> m_RaycastResults = new List<Graphic>(); //经过射线碰撞检测的结果存储在该集合中
static readonly List<Graphic> s_SortedGraphics = new List<Graphic>();

方法

//重写基类的方法
public override void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList) 

//判断符合条件的Graphic对象
private static void Raycast(Canvas canvas, Camera eventCamera, Vector2 pointerPosition, IList<Graphic> foundGraphics, List<Graphic> results) 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值