【问题标题】:How can i know touched which game object with Unity3D我怎么知道用 Unity3D 触摸了哪个游戏对象
【发布时间】:2016-10-05 22:50:30
【问题描述】:

我正在使用 Unity3D,并且我正在编程增强现实。如果我触摸屏幕并且触摸的位置有一个对象,我会做一些事情。 其实我想要“我怎么知道触摸了哪个游戏对象?

我的代码在这里:

    using UnityEngine;
using System.Collections;

public class Atak : MonoBehaviour {
    private Animator anim;
    private GameObject kamera;

    // Use this for initialization
    void Start () {
        anim = GetComponent<Animator> ();
        kamera = GameObject.FindGameObjectWithTag ("Kamera");
    }

    // Update is called once per frame
    void Update () {
        RaycastHit dokunma;
        if (Physics.Raycast(kamera.transform.position,Input.mousePosition,10)&&
            dokunma.collider.gameObject.tag=="Oyuncu" && Input.GetMouseButtonDown(0)
        ){

            anim.SetBool ("Bekle", false);
            anim.SetBool ("Saldir", true);
        } else{
            anim.SetBool ("Bekle", true);
            anim.SetBool ("Saldir", false);
        }
    }
}

编辑给我报错:

使用未赋值的局部变量'dokunma'

【问题讨论】:

    标签: c# unity3d augmented-reality raycasting


    【解决方案1】:

    您没有为 dokunma(RaycastHit) 变量分配任何内容。请注意,您必须使用 out 关键字将 dokunma 变量传递给 Physics.Raycast 函数,以便将其初始化并将光线投射的结果存储在其中。

    void Update()
    {
        Ray rayCast = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit dokunma;
        if (Physics.Raycast(rayCast, out dokunma, 10) &&
            dokunma.collider.gameObject.tag == "Oyuncu" && Input.GetMouseButtonDown(0)
        )
        {
    
            anim.SetBool("Bekle", false);
            anim.SetBool("Saldir", true);
        }
        else
        {
            anim.SetBool("Bekle", true);
            anim.SetBool("Saldir", false);
        }
    }
    

    在执行光线投射之前先检查是否有触摸会更有意义。始终使用CompareTag 函数来比较标签。下面的东西应该可以做到。

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray rayCast = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit dokunma;
            if (Physics.Raycast(rayCast, out dokunma, 10))
            {
                if (dokunma.collider.CompareTag("Oyuncu"))
                {
    
                    anim.SetBool("Bekle", false);
                    anim.SetBool("Saldir", true);
                }
                else
                {
                    anim.SetBool("Bekle", true);
                    anim.SetBool("Saldir", false);
                }
            }
        }
    }
    

    【讨论】:

    • 我贴的代码没有问题,看不到你当前的代码。请在我对您的代码的回答中复制新的Update 函数,您的问题应该得到解决。
    • 感谢您的回答,但我不使用主摄像头。我使用 vuforia 相机,但不能使用 Camera.main.ScreenPointToRay。请检查我的开始功能,我设置了名称相机。
    • 如果是这种情况,请将Camera.main.ScreenPointToRay(Input.mousePosition) 替换为kamera.GetComponent&lt;Camera&gt;().ScreenPointToRay(Input.mousePosition);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多