草庐IT

Unity手机触屏输入

AlphaIcarus 2023-03-28 原文

1、获取屏幕输入

新建脚本TouchInput,添加到MainCamera(主摄像机)上

public class TouchInput : MonoBehaviour
{
    public LayerMask touchInputMask;  //声明层级,射线只与设定的层级进行检测
    private Camera myCamera;          //声明摄像机

    private List<GameObject> touchList = new List<GameObject>();    //保存当前按下的物体,需要用List进行动态添加
    private GameObject[] touchesOld; //保存上一次按下的物体,不需要动态添加,与当前按下的物体比较,判断哪些物体取消了点击
    private RaycastHit hit;
    void Start()
    {
        myCamera = GetComponent<Camera>();
    }
    void Update()
    {
        if (Input.touchCount > 0)   //如果存在触屏输入
        {
            //初始化touchesOld,并保存上一帧按下的所有按键
            touchesOld = new GameObject[touchList.Count];
            touchList.CopyTo(touchesOld);
            touchList.Clear();  //清空列表,用于获取新的输入,保存当前按下的物体

            foreach (Touch touch in Input.touches)  //遍历所有的屏触屏输入
            {
                Ray ray = myCamera.ScreenPointToRay(touch.position);    //从触屏的地方发射射线

                if (Physics.Raycast(ray, out hit, touchInputMask))
                {
                    GameObject recipient = hit.transform.gameObject;    //获取射线碰撞的物体
                    touchList.Add(recipient);     //将该物体加入当前触碰列表

                    if (touch.phase == TouchPhase.Began)    //判断触屏的类型,如果为刚刚接触屏幕
                    {
                        //发送委托,调用物体OnTouchDown的方法
                        recipient.SendMessage("OnTouchDown", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                    if (touch.phase == TouchPhase.Ended)    //判断触屏的类型,如果手指离开屏幕
                    {
                        //发送委托,调用物体OnTouchUp的方法
                        recipient.SendMessage("OnTouchUp", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                    //如果长按屏幕或在屏幕上滑动
                    if (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved)    
                    {
                        //发送委托,调用物体OnTouchStay的方法
                        recipient.SendMessage("OnTouchStay", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                    if (touch.phase == TouchPhase.Canceled) //如果手指数量超过追踪上线,或用脸等平面接触屏幕
                    {
                        //发送委托,调用物体OnTouchExit的方法
                        recipient.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
            foreach (GameObject g in touchesOld)    //遍历上一帧点击的物体
            {
                if (!touchList.Contains(g))         //如果列表中不包含上一帧的物体
                {
                    //那么委托调用物体的OnTouchExit方法,该物已经取消点击
                    g.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver);
                }
            }
        }
    }
}

新建脚本Button

public class Button : MonoBehaviour
{
    public Color defaultColor;	//默认颜色
    public Color selectedColor;	//点击后的颜色
    private Material mat;
    private void Start()
    {
        mat = gameObject.GetComponent<Renderer>().material;
    }
    private void OnTouchDown()
    {
        mat.color = selectedColor;
    }
    private void OnTouchUp()
    {
        mat.color = defaultColor;
    }
    private void OnTouchStay()
    {
        mat.color = selectedColor;
    }
    private void OnTouchExit()
    {
        mat.color = defaultColor;
    }
}

添加几个Cube,将Button添加到Cube上

设置每个Cube的颜色
Build到手机后的运行结果

2、拖动效果

这里的Slider并不是UnityUI中的Slider

是使用基本物体拼装成的Slider

这里使用了3D物体中的Quad和Cube


然后可以在 Slider上创建一个BoxCollider 来限制Button的移动

新建脚本Slider

public class Slider : MonoBehaviour
{
    public Transform button;
    private Vector3 targetPos;
    private void Start()
    {
        targetPos = button.position;
    }
    private void Update()
    {
        button.position = Vector3.Lerp(button.position, targetPos, Time.deltaTime * 10f);
    }
    void OnTouchStay(Vector3 point)
    {
        targetPos = new Vector3(point.x, targetPos.y, targetPos.z);
    }
}

然后将Button添加到Button上

运行后就能拖动Button

接下来是显示数据,添加一个3DText设为Slider的子物体,并调整到合适的位置和大小

新建脚本Slider,添加到Slider上

public class Slider : MonoBehaviour
{
    public Transform knbo;
    public TextMesh textMesh;
    private Vector3 targetPos;

    private float sliderPercent;
    private float sliderLength;

    private void Start()
    {
        sliderLength = gameObject.GetComponent<BoxCollider>().size.x - 0.4f;
        targetPos = knbo.position;
    }
    private void Update()
    {
        knbo.position = Vector3.Lerp(knbo.position, targetPos, Time.deltaTime * 10f);
		//计算slider的比例
        sliderPercent = Mathf.Clamp01((knbo.localPosition.x + sliderLength / 2) / sliderLength);
													//保留一位小数
        textMesh.text = string.Format(sliderName + ": " + "{0:F1}", sliderPercent);	
    }
    public float GetSliderPercent()
    {
        return sliderPercent;
    }
    void OnTouchStay(Vector3 point)
    {
        targetPos = new Vector3(point.x, targetPos.y, targetPos.z);
    }
}

有关Unity手机触屏输入的更多相关文章

  1. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  2. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  3. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  4. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  5. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  6. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  7. ruby - ruby 中的同一个程序如何接受来自用户的输入以及命令行参数 - 2

    我的ruby​​脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes

  8. ruby-on-rails - 为什么用户必须输入 7 位数的 Twitter PIN 才能授予我的应用程序访问权限? - 2

    我正在为我的用户实现一些ruby​​onrails代码推特内容。我正在创建正确的oauth链接...类似http://twitter.com/oauth/authorize?oauth_token=y2RkuftYAEkbEuIF7zKMuzWN30O2XxM8U9j0egtzKv但在我的测试帐户授予对twitter的访问权限后,它会弹出一个页面,上面写着“您已成功授予对.我不知道用户应该在哪里输入此PIN以及他们为什么必须这样做。我认为这不是必要的步骤。Twitter应该将用户重定向到我在应用程序设置中提供的回调URL。有谁知道为什么会这样?更新我找到了thisarticle声明我需

  9. ruby - 使用 Ruby 将输入值适本地转换为整数或 float - 2

    我相信我对这个问题有一个很好的答案,但我想确保ruby​​-philes没有更好的方法来做到这一点。基本上,给定一个输入字符串,我想在适当的情况下将该字符串转换为整数,或在适当的情况下将其转换为float。否则,只返回字符串。我会在下面发布我的答案,但我想知道是否有更好的方法。例如:to_f_or_i_or_s("0523.49")#=>523.49to_f_or_i_or_s("0000029")#=>29to_f_or_i_or_s("kittens")#=>"kittens" 最佳答案 我会尽可能避免在Ruby中使用正则表达式

  10. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

随机推荐