首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >团结-使用Raycast选择对象-在Windows上工作,错误onWebGL (TouchScreen)

团结-使用Raycast选择对象-在Windows上工作,错误onWebGL (TouchScreen)
EN

Stack Overflow用户
提问于 2018-11-28 10:46:10
回答 2查看 2K关注 0票数 0

我想在场景中选择一个物体,在屏幕上触摸它。我已经编写了这段代码,它在Unity上或者在我为Windows编译应用程序时完美地工作。当我为WebGL编译时,我有一些奇怪的行为(在Firefox/Chrome上测试)

我得到的错误是,如果我把手指按在对象上,即使我使用的是TouchPhase.Began,我也会得到多个连续的点击,而不是一个。有人知道怎么解决这个问题吗?是个众所周知的问题吗?

这是我的密码

代码语言:javascript
复制
using UnityEngine;
using System.Collections.Generic;
using System.Xml.XPath;
using UnityEngine.UI;


public class RaycastObjHit : MonoBehaviour
{


private GameObject working_object;
private GameObject touchedObject;


void Update()
{
    if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began)
    {
        Ray ray = Camera.current.ScreenPointToRay(Input.GetTouch(0).position);
        RaycastHit hit;   

        if (Physics.Raycast(ray, out hit))
        {
            string ObjHitName = hit.transform.name;
            Debug.Log(hit.transform.name);
            if (hit.collider != null)
            {
                touchedObject = hit.transform.gameObject;

                if (touchedObject.GetComponent<Renderer>().material.color != Color.red )
                {
                    changeColor(touchedObject.transform.name, Color.red);   
                }else{
                    changeColor(touchedObject.transform.name, Color.green);   
                }

            }
                Debug.Log("Touched " + touchedObject.transform.name);
         }
     }

}
public void changeColor(string objId, Color color)
{
    working_object = GameObject.Find(objId);
    working_object.GetComponent<Renderer>().material.color = color;
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-28 15:54:57

如果有人想知道我是如何“解决”这个问题的,这是我的代码。是一个简单的解决方法,它使用布尔值来控制是否在同一事件期间继续按下监视器。重复一遍,这只是解决与WebGL“不兼容”的一个解决办法。

代码语言:javascript
复制
using UnityEngine;
using System.Collections.Generic;
using System.Xml.XPath;
using UnityEngine.UI;


public class RaycastObjHit : MonoBehaviour
{

private GameObject working_object;
private GameObject touchedObject;
private bool touchBegan = false;

void Update()
{
    if (Input.touchCount == 1)
    {
        if (Input.GetTouch(0).phase == TouchPhase.Began && !touchBegan)
        {
            touchBegan = true;
            Ray ray = Camera.current.ScreenPointToRay(Input.GetTouch(0).position);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                string ObjHitName = hit.transform.name;
                Debug.Log(hit.transform.name);
                if (hit.collider != null)
                {
                    touchedObject = hit.transform.gameObject;

                    if (touchedObject.GetComponent<Renderer>().material.color != Color.red)
                    {
                        changeColor(touchedObject.transform.name, Color.red);
                    }
                    else
                    {
                        changeColor(touchedObject.transform.name, Color.green);
                    }

                }

                Debug.Log("Touched " + touchedObject.transform.name);
            }
        } else if (Input.GetTouch(0).phase == TouchPhase.Ended && touchBegan){
            touchBegan = false;
        }
    }

}
public void changeColor(string objId, Color color)
{
    working_object = GameObject.Find(objId);
    working_object.GetComponent<Renderer>().material.color = color;
}
}
票数 0
EN

Stack Overflow用户

发布于 2018-11-28 11:55:43

这不是2018年的做法(今年,不是统一版)。在相机上放置一个PhysicsRaycaster,添加一个EventSystem,然后实现IPointer*Handler(下降,向上,进入,退出,点击,你命名它)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53517625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档