【Unity3D】对话框、隐藏与显示、拖拽

对话框在任何一个地方都随处可见,在游戏里面也肯定不例外啊,那么在Unity3D如何利用UGUI实现一个对话框呢?并且这个对话框可以任意拖拽,更重要的是,我可以想让它显示就显示,隐藏就隐藏,就是一个模态框Modal的样子,如下图所示:


其实也并不难啊,首先是UI的布置,具体可以参考《【Unity3D】公告栏与开始界面的布置》(点击打开链接)这里就不再赘述了,在Canvas上面,有一个Button、一个Text(并且改名为notice)作提示信息,还有一个image也就是这个对话框,上面有2个text,2个button。如下图所示。


之后我们编写如下的脚本,赋予image,怎么写脚本,怎么赋予对象在《【Unity3D】Helloworld》(点击打开链接)说过了,这里不再赘述了。

using UnityEngine;
using UnityEngine.UI;//犹如我们要获取一个text并操作,所以需要这个头文件
using System.Collections;

public class image : MonoBehaviour
{

    GameObject text;//获取notice提示文本,存在这个变量里面进行操作
    public static Vector3 vec3, pos;//用于存放坐标,其变量类型也是Vector3,从官方文档抄来的,我也不知道为什么

    //初始化函数
    void Start()
    {
        text = GameObject.Find("notice");//获取提示文本
        text.SetActive(false);//让提示文本隐藏
        gameObject.SetActive(false);//让自己隐藏,也就是这个image
    }

    // Update is called once per frame
    void Update()
    {

    }

    //按下鼠标将会被触发的事件
    public void PointerDown()
    {
        vec3 = Input.mousePosition;//获取当前鼠标位置
        pos = transform.GetComponent<RectTransform>().position;//获取自己所在的位置
    }

    //鼠标拖拽时候会被触发的事件
    public void Drag()
    {
        Vector3 off = Input.mousePosition - vec3;
        //此处Input.mousePosition指鼠标拖拽结束的新位置
        //减去刚才在按下时的位置,刚好就是鼠标拖拽的偏移量
        vec3 = Input.mousePosition;//刷新下鼠标拖拽结束的新位置,用于下次拖拽的计算
        pos = pos + off;//原来image所在的位置自然是要被偏移的
        transform.GetComponent<RectTransform>().position = pos;//直接将自己刷新到新坐标
    }

    //此函数接口将赋予给“弹出对话框”按钮的onClick事件
    public void onShow()
    {
        gameObject.SetActive(true);//显示自己
    }

    //此函数接口将赋予给“确认”按钮的onClick事件
    public void onOK()
    {
        text.SetActive(true);//让提示文本显示
        GameObject.Find("notice").GetComponent<Text>().text = "你点击了确定!";//并更改内容
        gameObject.SetActive(false);//让自己隐藏
    }

    //此函数接口将赋予给“取消”按钮的onClick事件
    public void onCancel()
    {
        text.SetActive(true);//让提示文本显示
        GameObject.Find("notice").GetComponent<Text>().text = "你点击了取消!";//并更改内容
        gameObject.SetActive(false);//让自己隐藏
    }
}
之后,我们将对这个image设置一个鼠标按下事件和鼠标拖拽事件,如下图所示。


之后和《【Unity3D】场景切换、UGUI组件事件、开始游戏与关闭游戏》(点击打开链接)一样,在Pointer Down事件中指明函数是image中的PointerDown,Drag就是image.Drag,如下图所示:


最后,对于其余各个Button指明相应的onClick事件,保存场景,发布,完成!


### 创建和实现 Unity3D 对话框Unity3D 中创建对话框通常涉及 UI 组件的设计以及 C# 脚本来控制逻辑。下面是一个简单的例子,展示了如何构建一个基本的对话框系统。 #### 设计对话框界面 1. **创建 Canvas** 打开 Unity 编辑器并新建一个场景,在 Hierarchy 面板右键选择 `UI -> Canvas` 来添加一个新的画布对象作为所有 UI 元素的基础容器[^1]。 2. **添加 Panel 和 Text Elements** 接着向 Canvas 下面依次添加 Panel (用于定义对话框区域), Image, Button 或者其他的 UI 控件如 InputField 等;再加入多个 Text Components 显示实际的文字内容。 ```csharp // 这里是简化版的C#代码片段用来说明如何通过脚本动态设置文本 using UnityEngine; using UnityEngine.UI; public class DialogueManager : MonoBehaviour { public GameObject dialogueBox; // 将面板拖拽到这里 private Text nameText; private Text dialogueText; void Start() { InitializeDialogue(); } void InitializeDialogue(){ nameText = dialogueBox.transform.Find("Name").GetComponent<Text>(); dialogueText = dialogueBox.transform.Find("Dialogue").GetComponent<Text>(); DisplayNextSentence(); } } ``` #### 实现对话流程控制 为了使玩家能够逐句阅读对话而不是一次性全部呈现出来,可以在每句话之间暂停等待用户的输入(比如按键)。这可以通过编写额外的状态机或者协程来完成。 ```csharp IEnumerator TypeSentence(string sentence){ foreach(char letter in sentence.ToCharArray()){ dialogueText.text += letter; yield return new WaitForSeconds(0.02f); } } void Update(){ if(Input.GetKeyDown(KeyCode.Space)){ DisplayNextSentence(); } } ``` 以上就是基于Unity官方文档和其他资源整理出来的有关于怎样建立简单对话系统的指南。当然这只是入门级的做法,对于更复杂的需求还需要进一步探索更多高级特性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值