一、无法响应事件的原因
1. UI射线检测(Raycast Target):UI一般是通过射线检测来响应事件,UI绕y轴旋转180°之后,表面法线发生改变,导致无法与UI交互。
2. 背面剔除(Backface Culling):UI绕y轴旋转180°之后,背面成为正面,Unity默认启用了背面剔除功能,即只渲染正面,不渲染背面,所以在旋转后,无法交互。
3. 禁用交互状态(Interactable):可能在UI旋转后,代码中将UI的交互状态设为禁用,导致无法交互。
以上就是我所了解的UI绕y轴旋转180°事件无法响应的常见问题,接下来我们讲解如何解决。
二、 解决方法
1. 先去看看是否把UI的交互状态(Interactable)设置为false了。![](https://i-blog.csdnimg.cn/blog_migrate/b4e17778531abfd7a725cbc1a6728e99.png)
这个属性是设置UI是否可以交互,设置为true,表示可以交互
2. 最简单的一种方法就是把Canvas上的Graphic Raycaster组件中的Ignore Reversed Graphics属性设置为false![](https://i-blog.csdnimg.cn/blog_migrate/afe18f19b232ab2cc9fea8e3b3fbc0b0.png)
这个属性的意思是:是否忽略UI的正面和反面。如果为true,那就是不忽略,射线只检测UI的正面,绕Y轴旋转180°之后,射线就检测不到这个UI了。如果为false,那就忽略,射线就会检测到UI的正反面。
3.用过代码判断鼠标点击的位置是否在UI的范围内
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TextUIRotation : MonoBehaviour
{
Button btn_test;//点击的按钮
RectTransform btn_rectTransform;//按钮的坐标
// Start is called before the first frame update
void Start()
{
btn_test = gameObject.GetComponent<Button>();
btn_rectTransform = btn_test.GetComponent<RectTransform>();
btn_test.transform.eulerAngles = new Vector3(0, 180, 0);//将按钮绕Y轴旋转180°
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector2 localMouserPos;//鼠标点击的位置
//将鼠标坐标转换为相对于点击按钮的本地坐标系
RectTransformUtility.ScreenPointToLocalPointInRectangle(btn_rectTransform, Input.mousePosition, null,out localMouserPos);
//判断鼠标点击的位置是否在按钮的范围内
if (btn_rectTransform.rect.Contains(localMouserPos))
{
Debug.Log("点击了旋转后的按钮");
}
}
}
}
这个方法相对来说就会麻烦一点