Unity自定义输入方式(通过可视化面板进行输入)

去年某个时间段做VR功能预研,利用Pico一体机做开发,当时通过Unity内置Inputfield组件实现外部输入,该组件貌似是调用系统内置输入方式,Pico一体机那个时候的输入方式简则是蛋疼得很,因为一调用该输入法就是双目模式,这就算了,更难受的是输入法贴到眼睛上了,根本不好使,偶尔还有穿透。当时就有了想法自定义一套输入方式,奈何一直没时间,最近遇到一个项目必须要用到自定义的,所以就简单的搞了一套将就用着。上代码先:
1:输入面板代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;

using UnityEngine;
using UnityEngine.UI;

using static UnityEngine.UI.GridLayoutGroup;

[RequireComponent(typeof(GridLayoutGroup))]
public class PanelInput : MonoBehaviour
{
    public delegate void DlAction(string input);
    public static event DlAction e_InputAction;
    public List<string> zimuli = new List<string>();
    public Font toChange;
    // Start is called before the first frame update
    void Start()
    {
        GridLayoutGroup group= GetComponent<GridLayoutGroup>();
        group.padding = new RectOffset(50, 50, 50, 50);
        group.spacing = new Vector2(20,20); 
        group.constraint = Constraint.FixedRowCount;
        group.constraintCount = 4;
        //添加字母到列表中。
        for (char i = 'A'; i <= 'Z'; i++)
            zimuli.Add(i.ToString());
        for (int i = 0; i < zimuli.Count; i++)
        {
            //此处为预制,也可以直接new一个空物体在添加组件,这里因为觉得太丑添加了个背景,然后做了个预制,虽然还是很丑
            GameObject item = Instantiate(Resources.Load<GameObject>("letterItem"),transform);
            item.name = zimuli[i].ToString();
            item.GetComponentInChildren<Text>().text = zimuli[i]; 
            item.GetComponentInChildren<Text>().font = toChange;
            item.GetComponentInChildren<Text>().color = Color.black; 
            item.AddComponent<Button>().onClick.AddListener(() => { OnClickBtn(item.name); }) ; 
        } 
    }

    private void OnClickBtn(string name)
    {
        gameObject.SetActive(false);
        e_InputAction(name);
    }

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

2:查询面板代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;

using UnityEngine;
using UnityEngine.UI;

using static UnityEngine.UI.GridLayoutGroup;

[RequireComponent(typeof(GridLayoutGroup))]
public class PanelInput : MonoBehaviour
{
    public delegate void DlAction(string input);
    public static event DlAction e_InputAction;
    public List<string> zimuli = new List<string>();
    public Font toChange;
    // Start is called before the first frame update
    void Start()
    {
        GridLayoutGroup group= GetComponent<GridLayoutGroup>();
        group.padding = new RectOffset(50, 50, 50, 50);
        group.spacing = new Vector2(20,20); 
        group.constraint = Constraint.FixedRowCount;
        group.constraintCount = 4;
        //添加字母到列表中。
        for (char i = 'A'; i <= 'Z'; i++)
            zimuli.Add(i.ToString());
        for (int i = 0; i < zimuli.Count; i++)
        {
            //此处为预制,也可以直接new一个空物体在添加组件,这里因为觉得太丑添加了个背景,然后做了个预制,虽然还是很丑
            GameObject item = Instantiate(Resources.Load<GameObject>("letterItem"),transform);
            item.name = zimuli[i].ToString();
            item.GetComponentInChildren<Text>().text = zimuli[i]; 
            item.GetComponentInChildren<Text>().font = toChange;
            item.GetComponentInChildren<Text>().color = Color.black; 
            item.AddComponent<Button>().onClick.AddListener(() => { OnClickBtn(item.name); }) ; 
        } 
    }

    private void OnClickBtn(string name)
    {
        gameObject.SetActive(false);
        e_InputAction(name);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
[Serializable]
public class PersonData 
{
    /// <summary>
    /// 工号
    /// </summary>
    public int Id { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int Age { get; set; }
    /// <summary>
    /// 职位
    /// </summary>
    public string Occupation { get; set; }
    /// <summary>
    /// 所在部门
    /// </summary>
    public string Department { get; set; }
    /// <summary>
    /// 个人荣誉
    /// </summary>
    public string Honor { get; set; }
    public PersonData(int id ,string name ,int age,string occ,string det,string honnor) 
    {
        Id = id;
        Name = name;
        Age = age;
        Occupation = occ;
        Department = det;
        Honor = honnor; 
    }
}

3:场景面板设置:然后对应的节点挂上上面的两个脚本;
在这里插入图片描述
4:最后效果,大致原理差不多,要更好点的就是完善下输入的资源以及美化面板!在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有点朦

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值