在我的项目中,我尝试在呈现 Texture 上显示可加性场景,并在 UI 中呈现 Texture 场景的 2D 精灵,并可以通过 Render Texture 点击精灵。我为此设置了代码,该代码使用鼠标位置,根据目标场景中的摄像机对该位置进行偏移,然后使用该摄像机的物理2D射线排斥器在目标场景的相应位置进行射线排斥。射线排斥器检测到的对象在结果 AppendList 中都会被检测到,但没有触发任何指针事件。当在场景中单独运行场景时,事件会触发,因此并不是精灵的设置问题。
我使用的代码有两种策略,但得出相同的结果。这些策略都在父场景中运行。
首先是扩展 GraphicsRaycaster 并覆盖 Raycast
public override void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList)
{
if(eventData.pointerCurrentRaycast.gameObject && eventData.pointerCurrentRaycast.gameObject == TextureImageRect.gameObject)
{
var result = eventData.pointerCurrentRaycast;
RectTransformUtility.ScreenPointToLocalPointInRectangle(TextureImageRect, result.screenPosition, null, out var point);
var normalPoint = Rect.PointToNormalized(TextureImageRect.rect, point);
Vector3 virtualPos = normalPoint;
virtualPos.x *= textureCamera.targetTexture.width;
virtualPos.y *= textureCamera.targetTexture.height;
eventData.position = virtualPos;
raycaster.Raycast(eventData, resultAppendList);
if (resultAppendList.Count > 0)
{
Debug.Log(resultAppendList[0].gameObject);
}
}
}
第二种方法是创建一个新 MonoBehaviour,创建自己的指针事件数据
private void Update()
{
var eventData = new PointerEventData(EventSystem.current) { position = Mouse.current.position.ReadValue() };
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventData, results);
if(results.Exists(i => i.gameObject == gameObject))
{
var result = results.Find(i => i.gameObject == gameObject);
RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, result.screenPosition, null, out var point);
var normalPoint = Rect.PointToNormalized((transform as RectTransform).rect, point);
Vector3 virtualPos = normalPoint;
virtualPos.x *= textureCamera.targetTexture.width;
virtualPos.y *= textureCamera.targetTexture.height;
eventData.position = virtualPos;
var textureResults = new List<RaycastResult>();
raycaster.Raycast(eventData, textureResults);
if (textureResults.Count > 0)
Debug.Log(textureResults[0]);
}
}
(如果有人要问为什么我这样做的原因,我想创建一个系统,可以在主场景上的 mini 游戏上叠放覆盖层。使用 Render Texture 而不是直接将它们放在摄像机前面,因为主游戏是 3D 的,而 mini 游戏是 2D 的,并且使用正交摄像机)
快速编辑:忘了提及我使用的是 uGUI/Canvas 系统。
评论 (0)