简单给你个思路吧:
首先处理点击了对象(obj):
1) 首先obj需要用到一个碰撞器,此处用Box Collider,一个自定义组件Controller.cs,用来检测鼠标是否点击。
2) 在obj中添加Box Collider组件,可以不用设置isTrigger,根据自己需求而定。
3) 在obj中添加Controller组件。
4) 设置obj的标签Tag为自定义标签,此处设置为”myCube”。
5) Controller组件代码如下:
void Update()
{
if(Input.GetButtonDown("Fire1"))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if(Physics.Raycast(ray,out hitInfo))
{
GameObject gameObj = hitInfo.transform.gameObject;
if(gameObj.transform.tag == "myCube")
{
//最好在这里吧对象坐标也获取到,存到变量待用;
//这里需要标识以下,实现隐藏和显示
if(!m_isShowBtn)//如果没有按钮弹出
{
m_isShowBtn=true;
}
else
{
m_isShowBtn=false;
}
}
}
}
}
注:上面是引用别人的,但原理没问题。
其次我们来处理弹出按钮和字幕,
1.首先你需要知道对象坐标,
2.然后在OnGUI函数中加入以下代码:
void OnGUI{
if(m_isShowBtn)
{
if (GUI.Button(new Rect(x, y, w,h ),"字母框"))
{
//这里获取字母框,可以加个标示,比如:
m_isShowText=true;
}
if(m_isShowText)
{
//字体大小
GUI.skin.label.fontSize = 32;
//居中
GUI.skin.label.alignment = TextAnchor.MiddleCenter;
GUI.Label(new Rect(x,y, w, h), "这里是字母内容:");
}
}
}
解释一下,这是动态生成UI按钮,其中,x,y为按钮或文本的起始坐标,w,h为宽高,这些参数大小可以根据获取到的物体坐标来定义,或者用其他方法获取都行,自己研究一下;
自己思路随便写了以下,有BUG的话自己调一下
using UnityEngine;
using System.Collections;
public class Click : MonoBehaviour
{
public GameObject btn;
public GameObject kuang;
void Awake()
{
btn.SetActive(false);
kuang.SetActive(false);
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo))
{
if (hitInfo.collider.name == "Cube")
{
btn.SetActive(true);
if (kuang.activeSelf && btn.activeSelf)
{
btn.SetActive(false);
kuang.SetActive(false);
}
}
}
}
if (btn == null)
{
return;
}
else {
UIEventListener.Get(btn.gameObject).onClick = MyClick;
}
}
void MyClick(GameObject o)
{
kuang.SetActive(true);
}
}
按钮和对话框直接拖进去就OK ,脚本挂载Cube上
首先放两个按钮,一个字幕窗口,开始的时候把第二个按钮和字幕窗口都隐藏掉。
点击第一个按钮,第二个按钮出现,然后再点击第二个按钮,字幕出现。
这代码太简单。。。。。。。