var isOrthographic = camera.orthographic; if(isOrthographic) { // 转换为射线 for (int i = 0; i < ViewPortPoints.Length; i++) { Ray ray = camera.ViewportPointToRay(ViewPortPoints[i]); var rayCastToPoint = ray.origin + ray.direction * camera.farClipPlane; var rayCastData = new KeyValuePair<Vector3, Vector3>(ray.origin, rayCastToPoint); rayCastDataList.Add(rayCastData); } } else { var radio = camera.farClipPlane / cameraNearClipPlane; var cameraPosition = camera.transform.position;
// 获取饰扣四个角的屏幕映射世界坐标 var lbNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[0]); var ltNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[1]); var rtNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[2]); var rbNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[3]); var ctNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[4]);
var lbNearPlaneCameraWorldPointDir = lbNearPlaneWorldPoints - cameraPosition; var ltNearPlaneCameraWorldPointDir = ltNearPlaneWorldPoints - cameraPosition; var rtNearPlaneCameraWorldPointDir = rtNearPlaneWorldPoints - cameraPosition; var rbNearPlaneCameraWorldPointDir = rbNearPlaneWorldPoints - cameraPosition; var ctNearPlaneCameraWorldPointDir = ctNearPlaneWorldPoints - cameraPosition;
var lbFarPlaneWorldPoint = cameraPosition + lbNearPlaneCameraWorldPointDir * radio; var ltFarPlaneWorldPoint = cameraPosition + ltNearPlaneCameraWorldPointDir * radio; var rtFarPlaneWorldPoint = cameraPosition + rtNearPlaneCameraWorldPointDir * radio; var rbFarPlaneWorldPoint = cameraPosition + rbNearPlaneCameraWorldPointDir * radio; var ctFarPlaneWorldPoint = cameraPosition + ctNearPlaneCameraWorldPointDir * radio;
var lbRayCastData = new KeyValuePair<Vector3, Vector3>(lbNearPlaneWorldPoints, lbFarPlaneWorldPoint); var ltRayCastData = new KeyValuePair<Vector3, Vector3>(ltNearPlaneWorldPoints, ltFarPlaneWorldPoint); var rtRayCastData = new KeyValuePair<Vector3, Vector3>(rtNearPlaneWorldPoints, rtFarPlaneWorldPoint); var rbRayCastData = new KeyValuePair<Vector3, Vector3>(rbNearPlaneWorldPoints, rbFarPlaneWorldPoint); var ctRayCastData = new KeyValuePair<Vector3, Vector3>(ctNearPlaneWorldPoints, ctFarPlaneWorldPoint); rayCastDataList.Add(lbRayCastData); rayCastDataList.Add(ltRayCastData); rayCastDataList.Add(rtRayCastData); rayCastDataList.Add(rbRayCastData); rayCastDataList.Add(ctRayCastData); } returntrue; }
///<summary> /// 区域顶点 ///</summary> [Header("区域顶点")] public Vector3 AreaPoint = Vector3.zero;
///<summary> /// 区域法线 ///</summary> [Header("区域法线")] public Vector3 AreaNormal = Vector3.up;
///<summary> /// 更新摄像机指定平面映射区域数据 ///</summary> publicvoidUpdateAreaDatas() { CameraUtilities.GetCameraRayCastDataList(mCameraComponent, ref mRayCastDataList); CameraUtilities.GetCameraVisibleArea(mCameraComponent, AreaPoint, AreaNormal, ref mAreaPointsList, ref mRectAreaPointsList); mAreaLinesList.Clear(); mRectAreaLinesList.Clear(); if(mAreaPointsList.Count > 0) { var lbToLtLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[0], mAreaPointsList[1]); var ltToRtLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[1], mAreaPointsList[2]); var rtToRbLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[2], mAreaPointsList[3]); var rbToLbLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[3], mAreaPointsList[0]); mAreaLinesList.Add(lbToLtLine); mAreaLinesList.Add(ltToRtLine); mAreaLinesList.Add(rtToRbLine); mAreaLinesList.Add(rbToLbLine);
var rectLbToLtLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[0], mRectAreaPointsList[1]); var rectLtToRtLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[1], mRectAreaPointsList[2]); var rectRtToRbLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[2], mRectAreaPointsList[3]); var rectRbToLbLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[3], mRectAreaPointsList[0]); mRectAreaLinesList.Add(rectLbToLtLine); mRectAreaLinesList.Add(rectLtToRtLine); mRectAreaLinesList.Add(rectRtToRbLine); mRectAreaLinesList.Add(rectRbToLbLine); } }
var isOrthographic = camera.orthographic; if(isOrthographic) { // 转换为射线 for (int i = 0; i < ViewPortPoints.Length; i++) { Ray ray = camera.ViewportPointToRay(ViewPortPoints[i]); var rayCastToPoint = ray.origin + ray.direction * camera.farClipPlane; var rayCastData = new KeyValuePair<Vector3, Vector3>(ray.origin, rayCastToPoint); rayCastDataList.Add(rayCastData); } } else { var radio = camera.farClipPlane / cameraNearClipPlane; var cameraPosition = camera.transform.position;
// 获取饰扣四个角的屏幕映射世界坐标 var lbNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[0]); var ltNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[1]); var rtNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[2]); var rbNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[3]); var ctNearPlaneWorldPoints = camera.ViewportToWorldPoint(ViewPortPoints[4]);
var lbNearPlaneCameraWorldPointDir = lbNearPlaneWorldPoints - cameraPosition; var ltNearPlaneCameraWorldPointDir = ltNearPlaneWorldPoints - cameraPosition; var rtNearPlaneCameraWorldPointDir = rtNearPlaneWorldPoints - cameraPosition; var rbNearPlaneCameraWorldPointDir = rbNearPlaneWorldPoints - cameraPosition; var ctNearPlaneCameraWorldPointDir = ctNearPlaneWorldPoints - cameraPosition;
var lbFarPlaneWorldPoint = cameraPosition + lbNearPlaneCameraWorldPointDir * radio; var ltFarPlaneWorldPoint = cameraPosition + ltNearPlaneCameraWorldPointDir * radio; var rtFarPlaneWorldPoint = cameraPosition + rtNearPlaneCameraWorldPointDir * radio; var rbFarPlaneWorldPoint = cameraPosition + rbNearPlaneCameraWorldPointDir * radio; var ctFarPlaneWorldPoint = cameraPosition + ctNearPlaneCameraWorldPointDir * radio;
var lbRayCastData = new KeyValuePair<Vector3, Vector3>(lbNearPlaneWorldPoints, lbFarPlaneWorldPoint); var ltRayCastData = new KeyValuePair<Vector3, Vector3>(ltNearPlaneWorldPoints, ltFarPlaneWorldPoint); var rtRayCastData = new KeyValuePair<Vector3, Vector3>(rtNearPlaneWorldPoints, rtFarPlaneWorldPoint); var rbRayCastData = new KeyValuePair<Vector3, Vector3>(rbNearPlaneWorldPoints, rbFarPlaneWorldPoint); var ctRayCastData = new KeyValuePair<Vector3, Vector3>(ctNearPlaneWorldPoints, ctFarPlaneWorldPoint); rayCastDataList.Add(lbRayCastData); rayCastDataList.Add(ltRayCastData); rayCastDataList.Add(rtRayCastData); rayCastDataList.Add(rbRayCastData); rayCastDataList.Add(ctRayCastData); } returntrue; }
///<summary> /// 区域顶点 ///</summary> [Header("区域顶点")] public Vector3 AreaPoint = Vector3.zero;
///<summary> /// 区域法线 ///</summary> [Header("区域法线")] public Vector3 AreaNormal = Vector3.up;
///<summary> /// 更新摄像机指定平面映射区域数据 ///</summary> publicvoidUpdateAreaDatas() { CameraUtilities.GetCameraRayCastDataList(mCameraComponent, ref mRayCastDataList); CameraUtilities.GetCameraVisibleArea(mCameraComponent, AreaPoint, AreaNormal, ref mAreaPointsList, ref mRectAreaPointsList); mAreaLinesList.Clear(); mRectAreaLinesList.Clear(); if(mAreaPointsList.Count > 0) { var lbToLtLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[0], mAreaPointsList[1]); var ltToRtLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[1], mAreaPointsList[2]); var rtToRbLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[2], mAreaPointsList[3]); var rbToLbLine = new KeyValuePair<Vector3, Vector3>(mAreaPointsList[3], mAreaPointsList[0]); mAreaLinesList.Add(lbToLtLine); mAreaLinesList.Add(ltToRtLine); mAreaLinesList.Add(rtToRbLine); mAreaLinesList.Add(rbToLbLine);
var rectLbToLtLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[0], mRectAreaPointsList[1]); var rectLtToRtLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[1], mRectAreaPointsList[2]); var rectRtToRbLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[2], mRectAreaPointsList[3]); var rectRbToLbLine = new KeyValuePair<Vector3, Vector3>(mRectAreaPointsList[3], mRectAreaPointsList[0]); mRectAreaLinesList.Add(rectLbToLtLine); mRectAreaLinesList.Add(rectLtToRtLine); mRectAreaLinesList.Add(rectRtToRbLine); mRectAreaLinesList.Add(rectRbToLbLine); } }
VisualElement labelWithStyle = new Label("USS Using Label Type Selector!");
Class Selctor
1 2 3 4 5 6 7
VisualElement smallLabelWithStyle = new Label("USS Using SmallLabel Class Selector!"); smallLabelWithStyle.AddToClassList("SmallLabel"); VisualElement bigLabelWithStyle = new Label("USS Using BigLabel Class Selector!"); smallLabelWithStyle.AddToClassList("BigLabel"); VisualElement labelWithStyle = new Label("USS Using Label Type Selector!"); VisualElement boldLabelWithStyle = new Label("USS Using BoldLabel Class Selector!"); boldLabelWithStyle.AddToClassList("BoldLabel");
Name Selector
1 2 3
Button ussCenterButton = new Button(); ussCenterButton.name = "CenterButton"; ussCenterButton.text = "Center USS Button Name Selector";
---@class CS.UnityEngine.Object : CS.System.Object local Object = {} ---@field public name string @ ---@field public hideFlags number @ ---@return number @ function Object:GetInstanceID() end
---@return number @ function Object:GetHashCode() end
---@param other CS.System.Object @ ---@return boolean @ function Object:Equals(other) end
---@return string @ function Object:ToString() end
---@param original CS.UnityEngine.Object @ ---@param position CS.UnityEngine.Vector3 @ ---@param rotation CS.UnityEngine.Quaternion @ ---@return CS.UnityEngine.Object @ function Object.Instantiate(original, position, rotation) end
---@param original CS.UnityEngine.Object @ ---@param position CS.UnityEngine.Vector3 @ ---@param rotation CS.UnityEngine.Quaternion @ ---@param parent CS.UnityEngine.Transform @ ---@return CS.UnityEngine.Object @ function Object.Instantiate(original, position, rotation, parent) end
---@param original CS.UnityEngine.Object @ ---@return CS.UnityEngine.Object @ function Object.Instantiate(original) end
---@param original CS.UnityEngine.Object @ ---@param parent CS.UnityEngine.Transform @ ---@return CS.UnityEngine.Object @ function Object.Instantiate(original, parent) end
---@param original CS.UnityEngine.Object @ ---@param parent CS.UnityEngine.Transform @ ---@param instantiateInWorldSpace boolean @ ---@return CS.UnityEngine.Object @ function Object.Instantiate(original, parent, instantiateInWorldSpace) end
---@param obj CS.UnityEngine.Object @ ---@param t number @ function Object.Destroy(obj, t) end
---@param obj CS.UnityEngine.Object @ function Object.Destroy(obj) end
---@param obj CS.UnityEngine.Object @ ---@param allowDestroyingAssets boolean @ function Object.DestroyImmediate(obj, allowDestroyingAssets) end
---@param obj CS.UnityEngine.Object @ function Object.DestroyImmediate(obj) end
---@param type CS.System.Type @ ---@return CS.UnityEngine.Object[] @ function Object.FindObjectsOfType(type) end
---@param type CS.System.Type @ ---@param includeInactive boolean @ ---@return CS.UnityEngine.Object[] @ function Object.FindObjectsOfType(type, includeInactive) end
---@param target CS.UnityEngine.Object @ function Object.DontDestroyOnLoad(target) end
---@param type CS.System.Type @ ---@return CS.UnityEngine.Object @ function Object.FindObjectOfType(type) end
---@param type CS.System.Type @ ---@param includeInactive boolean @ ---@return CS.UnityEngine.Object @ function Object.FindObjectOfType(type, includeInactive) end
///<summary> /// 响应Task等待按钮点击 ///</summary> privateasyncvoidOnBtnAwaitTaskUsingClick() { var awaitTask = Task.Run(AwaitTaskAction); Debug.Log($"AwaitTaskAction has been launched. Main Thread:{Thread.CurrentThread.ManagedThreadId}"); var sumResult = await awaitTask; Debug.Log($"sumResult:{sumResult}"); Debug.Log($"DateTime.Now.Millisecond:{DateTime.Now.Millisecond}"); }
///<summary> /// 等待的Task方法 ///</summary> ///<returns></returns> privateasync Task<int> AwaitTaskAction() { Debug.Log($"AwaitTaskAction Start"); Debug.Log($"DateTime.Now.Millisecond:{DateTime.Now.Millisecond}"); await Task.Delay(1000); Debug.Log($"AwaitTaskAction After Task.Delay(1)"); Debug.Log($"DateTime.Now.Millisecond:{DateTime.Now.Millisecond}"); int sum = 0; for(int i = 0; i < 1000000000; i++) { sum++; } await Task.Delay(2000); Debug.Log($"AwaitTaskAction End"); Debug.Log($"DateTime.Now.Millisecond:{DateTime.Now.Millisecond}"); return sum; }
等待一秒过后,Task.Delay(1)异步任务完成,触发__d__10状态机的MoveNext执行,此时状态机<>1__state值为0,将Task.Delay(1).GetAwaiter()对象保存到awaiter1,<>u__1构建一个新的TaskAwaiter()对象,<>1__state状态机值设置成-1,然后调用awaiter1.GetResult()结束异步任务完成等待(因为是Task.Delay(1)所以没有结果需要保存),此时打印**”AwaitTaskAction After Task.Delay(1)**
紧接着打印**”AwaitTaskAction After Task.Delay(2)”并将累加结果5__1保存到sum51成员变量,然后将状态机<>1__state值设置成-2**同时将累加结果sum51通过<>t__builder(**AsyncTaskMethodBuilder类型)调用SetResult(sum51)将AwaitTaskAction()方法调用的返回结果设置到异步任务构建器里
纵向代表每个人,横向表示每天,✔️表示吃了,✘表示没吃,每天吃了要出3元,不吃要出1.5元,最后统计每个月每人餐饮伙食费 可以看到通过SUMIF我们成功统计出了指定单元格到指定单元格里包含✔️和✘的数量,然后乘以对应的单价再相加即得到我们要的统计总和。 更多的自带函数学习参考:Excel Function