Unity Pico开发之键盘输入

在Pico的开发过程中,发现了一个严重的问题,Pico没有办法像手机那样调取键盘输入,如果想要调取,需要Pico那面的技术支持,非常的麻烦,所以就自己做了一个输入键盘,唯一的缺点就是不能进行中文输入,只能输入英文和数字。有需要的小伙伴可以借鉴一下,如果有更好的方法,欢迎指导,大家共同学习。工程文件会在文章末尾分想给大家
效果如下:
在这里插入图片描述
下面来分享一下实现过程:
Pico开发最好不要用UI(Canvas),我最开始的时候用的就是UI,但是各种问题不断,所以后来改用Plane了。首先就是搭建上面效果图的场景,将所有的Plane摆放好,在要点击的地方放上一个BoxCollider,用来进行射线检测,就像下图
在这里插入图片描述
我们将建好的虚拟键盘放到Pvr_UnitySDK下面,Pico的搭建之前的文章就有,不懂的可以看一下(都到这一步了,不可能不知道咋弄)。
接下来就可进行编写代码了,在这之前还需要所有按键编辑一个Tag.
在这里就直接上代码了,代码中都有注释,简单易懂

using System.Collections.Generic;
using UnityEngine;
using Pvr_UnitySDKAPI;

public class KeyInput : MonoBehaviour
{

    private GameObject currentTrigerobj;
    /// <summary>
    /// 是否大写
    /// </summary>
    private bool isUp = false;
    /// <summary>
    /// 显示输入的内容
    /// </summary>
    public TextMesh Acctext;
    /// <summary>
    /// 存放按键的列表
    /// </summary>
    public static List<GameObject> mList = new List<GameObject>();
    /// <summary>
    /// 键盘
    /// </summary>
    public GameObject Keyboard;
    /// <summary>
    /// 键盘父物体
    /// </summary>
    public GameObject KeyboardFather;
    /// <summary>
    /// 是否隐藏
    /// </summary>
    private bool isHide = true;
    /// <summary>
    /// 限制输入的字符数
    /// </summary>
    private float Cha_max = 15;
    private float Cha_min = 0;
    /// <summary>
    /// 当前输入的字符数
    /// </summary>
    public static float Cha_now = 0;


    public TextMesh bug;

    private void Awake()
    {
        Init();
        KeyboardFather.SetActive(false);
    }
    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Pvr_Controller.CurrColliderGameObject != null)
        {
            //获取选中的按键
            CurrentTrigerObj = Pvr_Controller.CurrColliderGameObject;
            //播放选中动画
            if (CurrentTrigerObj.tag == "Key" || CurrentTrigerObj.tag == "Back" || CurrentTrigerObj.tag == "Change" || CurrentTrigerObj.tag == "Ent" || CurrentTrigerObj.tag == "Sure" || CurrentTrigerObj.tag == "Return")
            {
                CurrentTrigerObj.GetComponent<Animation>().Play();
            }
            //获取选中按键的名称
            string s = CurrentTrigerObj.name;

            if (Controller.UPvr_GetKeyDown(0, Pvr_KeyCode.TOUCHPAD) || Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space))
            {
                bug.text = "点击的按键为:"+CurrentTrigerObj.name;
                switch (CurrentTrigerObj.tag)
                {
                    case "Account":
                        //点击输入框显示键盘
                        Acctext = CurrentTrigerObj.GetComponentInChildren<TextMesh>();
                        Cha_now = Acctext.text.Length;
                        Keyboard.SetActive(true);
                        break;
                    case "Key":
                        if (Cha_min <= Cha_now && Cha_now < Cha_max)
                        {
                            //判断一下是不是“.”
                            if (s == "。")
                            {
                                s = ".";
                            }
                            //将输入的内容显示出来
                            Acctext.text += s;
                            //统计输入的字符
                            Cha_now++;
                        }
                        break;
                    case "Back":
                        //删除输入的内容
                        if (Cha_min < Cha_now && Cha_now <= Cha_max)
                        {
                            if (Acctext.text != "")
                            {
                                Acctext.text = DelString(Acctext.text);
                                Cha_now--;
                            }
                        }
                        break;
                    case "Change":
                        //修改大小写
                        Capslk();
                        isUp = !isUp;
                        break;
                    case "Ent":
                        Keyboard.SetActive(false);
                        break;
                    case "Sure":
                        //退出
                        if (Acctext.text == "zxc")
                        {
#if UNITY_EDITOR

                            UnityEditor.EditorApplication.isPlaying = false;
#else
                            Application.Quit();
#endif
                        }
                        else
                        {
                            bug.text = "您输入的内容为:" + Acctext.text;
                        }

                        break;
                    case "Return":
                        Keyboard.SetActive(false);
                        KeyboardFather.SetActive(false);
                        break;
                }
            }
        }
    }
    public GameObject CurrentTrigerObj
    {
        get { return currentTrigerobj; }
        set
        {
            if (currentTrigerobj != value)
            {

            }
            currentTrigerobj = value;
        }
    }

    /// <summary>
    /// 删除
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    private string DelString(string s)
    {
        if (s.Length > 0)
        {
            int len = s.Length;
            Debug.Log(len);
            s = s.Substring(0, len - 1);
        }
        return s;
    }
    /// <summary>
    /// 大小写锁定
    /// </summary>
    private void Capslk()
    {
        Debug.Log("切换大小写");
        for (int i = 0; i < mList.Count; i++)
        {
            mList[i].name = ChangeStr(mList[i].name);
            if (!isUp)
            {
                mList[i].GetComponent<MeshRenderer>().materials[0].CopyPropertiesFromMaterial((Material)Resources.Load("Key/" + mList[i].name.ToString() + mList[i].name.ToString(), typeof(Material)));
            }
            if (isUp)
            {
                mList[i].GetComponent<MeshRenderer>().materials[0].CopyPropertiesFromMaterial((Material)Resources.Load("Key/" + mList[i].name.ToString(), typeof(Material)));
            }
            Debug.Log("success");
        }
    }
    /// <summary>
    /// 改变字符的大小写
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    private string ChangeStr(string s)
    {
        if (!isUp)
        {
            s = s.ToUpper();
        }
        if (isUp)
        {
            s = s.ToLower();
        }
        return s;
    }
    /// <summary>
    /// 将所有按键放到队列中
    /// </summary>
    public void Init()
    {
        Cha_now = 0;
        try
        {
            GameObject go = GameObject.Find("Key");
            foreach (Transform item in go.transform)
            {
                mList.Add(item.gameObject);
            }
        }
        catch (System.Exception)
        {

        }
        Keyboard.SetActive(false);
    }  

}

如果有小伙伴将上面的的代码直接拷贝下来之后,会发现Pvr_Controller.CurrColliderGameObject这个地方会报错。那是因为我没有找到自带的射线检测在什么位置(有的人说没有。咱也不知道是真是假),所以就自己在Pvr_Controller脚本中又添加了一下射线检测的方法:
需要用到的变量

 /*************************************Modified Added****************************************/
    /// <summary>
    /// 手柄碰撞圆点(自带的)
    /// </summary>
    public GameObject dot;
    /// <summary>
    /// 手柄射线检测碰撞到的物体
    /// </summary>
    public static GameObject CurrColliderGameObject;
    /// <summary>
    /// 手柄射线的初始点
    /// </summary>
    private Transform StartPoint;

上面的StartPoint指的是发射射线的初始点,自己创建一个空物体放到手柄前方就好了。
手柄发射射线的方法

 /*************************************Modified Added****************************************/
    /// <summary>
    /// 手柄射线检测
    /// 控制碰撞圆点的位置
    /// </summary>
    void RayColliderObj()
    {
        RaycastHit hit;
        Ray ray = new Ray(StartPoint.position, (dot.transform.position - StartPoint.position).normalized);
        if (Physics.Raycast(ray, out hit))
        {
            dot.transform.position = hit.point;
            Debug.DrawLine(StartPoint.position, hit.point, Color.red);
            GameObject hitObj = hit.collider.gameObject;
            if (hitObj != null)
            {
                CurrColliderGameObject = hitObj;
            }
            else
            {
                CurrColliderGameObject = null;
            }
        }
    }

然后再Update中调用上面的方法就OK,解决问题。如果有知道SDK如果有自带的检测的话还请告知一下,感激不尽。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
Unity Pico 是一种适用于虚拟现实(VR)和增强现实(AR)应用开发的游戏引擎。Unity Pico 支持键盘的调用,用于玩家与虚拟世界进行交互。 在 Unity Pico 中调用键盘可以通过下面的步骤实现: 首先,需要创建一个输入字段。可以使用 Unity Pico 提供的 InputField 组件在场景中创建一个文本输入框。通过调整其大小和位置,将其放置在适当的位置。 接下来,我们需要处理键盘输入事件。可以为 InputField 组件添加一个脚本,来处理键盘输入。在这个脚本中,我们可以使用 Unity Pico 提供的 Input 类来获取键盘输入。 在处理键盘输入时,可以使用 Input.GetKey() 方法来判断某个按键是否被按下。例如,可以检查用户是否按下了回车键来触发某个操作,或者检查用户是否按下了字母键来实现输入文本。 另外,还可以使用 Input.inputString 属性来获取用户输入的字符串。在每一帧中,我们可以通过检查这个属性的值来获取用户最新输入的字符。 最后,在获取到用户的输入后,可以根据需要进行相应的处理,比如更新场景中的元素,或者将输入发送到网络等等。 总而言之,Unity Pico 可以通过创建和处理输入字段,以及使用 Input 类来获取用户键盘输入,实现与虚拟世界的交互。这为开发者提供了丰富的可能性来创建与用户进行键盘输入交互的虚拟现实和增强现实应用。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小温同学的账号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值