Unity相机的改变会影响点击对象的能力。

问题描述 投票:-1回答:1

我正在构建一个游戏,除了在摧毁一个盒子的时候,是第一人称视角,然后是第三人称。

正在摧毁的盒子需要被打3次(也就是点击3次)才能完全摧毁。第一次打拳的时候换镜头可以用,但是之后回到第一人称镜头的时候就没有登记任何点击,没有换镜头的时候完全可以用。这是在手机上。谁能帮帮我?

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

public class Fist : MonoBehaviour
{
    public GameObject fistScript;
    public bool isBroken = false;
    int count = 4;
    GameObject piece1;
    GameObject piece2;
    GameObject piece3;
    GameObject piece4;
    bool inTrigger;
    public GameObject rubble;
    public GameObject zone;
    Animator anim;
    public GameObject player;
    public GameObject firstPersonCam;
    public GameObject thirdPersonCam;

    private void Start()
    {
        piece1 = rubble.transform.Find("1").gameObject;
        piece2 = rubble.transform.Find("2").gameObject;
        piece3 = rubble.transform.Find("3").gameObject;
        piece4 = rubble.transform.Find("4").gameObject;
        zone = rubble.transform.Find("FistTriggerZone").gameObject;
        anim = player.GetComponent<Animator>();
    }

    public void Update()
    {
        // chainsaw is on
        if (fistScript.GetComponent<FistOn>().fistOn == true)
        {
            //set zone active
            zone.SetActive(true);
            //set trigger inactive if in trigger so that it can register click on object
            if (inTrigger)
            {
                zone.SetActive(false);
            }
            else if (!inTrigger)
            {
                zone.SetActive(true);
            }
        // chainsaw is off
        } 
        else 
        {
            zone.SetActive(false);
        }

        //if it's not broken yet
        if (!isBroken)
        {
            DestroyBlock();
        } 
        else 
        {
            zone.SetActive(false);
        }
    }

    public void DestroyBlock()
    {
        RaycastHit hit = new RaycastHit();
        for (int i = 0; i < Input.touchCount; ++i) 
        {
           if (Input.GetTouch(i).phase.Equals(TouchPhase.Began)) 
           {
                // Construct a ray from the current touch coordinates
                Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position);
                if (Physics.Raycast(ray, out hit)) 
                {
                    if (hit.transform.name == "1" || hit.transform.name == "2" || hit.transform.name == "3" || hit.transform.name == "4")
                    {
                        if (fistScript.GetComponent<FistOn>().fistOn == true)
                        {
                            if (count == 4)
                            {
                                StartCoroutine(SwitchCamera());
                                Destroy(piece1);
                            } 
                            else if (count == 3)
                            {
                                StartCoroutine(SwitchCamera());
                                Destroy(piece2);
                            } 
                            else if (count == 2)
                            {
                                StartCoroutine(SwitchCamera());
                                Destroy(piece3);
                            } 
                            else if (count == 1)
                            {
                                StartCoroutine(SwitchCamera());
                                Destroy(piece4);
                                isBroken = true;
                            }
                            count-=1;
                        }
                        anim.SetInteger("action",0);
                    }
                }
            }
        }
    }

    void OnTriggerEnter()
    {
        inTrigger = true;
    }

    void OnTriggerExit()
    {
        inTrigger = false;
    }

    private IEnumerator SwitchCamera()
    {
        firstPersonCam.SetActive(false);
        thirdPersonCam.SetActive(true);
        anim.SetInteger("action", 6);

        yield return new WaitForSeconds(2);

        firstPersonCam.SetActive(true);
        thirdPersonCam.SetActive(false);
    }
}
c# unity3d
1个回答
0
投票

你的问题就在这里。

// Construct a ray from the current touch coordinates
Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position);

你是用Camera.main把触摸投射到世界空间里 而不是用你当前的活动相机 你要做的是像这样的事情:你的触摸是用Camera.main投射到世界空间,而不是当前活动的摄像头。

thirdPersonCam.GetComponent<Camera>().ScreenPointToRay(Input.GetTouch(i).position);

还有一点需要注意的是,你应该避免在Update()函数中使用Camera.main和GetComponent<>(),因为它们都很慢,不应该每一帧都做。

如果你需要对这些东西的引用,如果可能的话,你应该把它们移到自己的变量中,并在Start()函数或其他不是每帧都发生的地方分配它们。

EDIT:为了澄清Camera.main并不是指当前正在渲染的摄像机,也不是指在其他摄像机之上的摄像机,它只是Unity找到的第一个带有 "主摄像机 "标签的摄像机。

我个人认为应该去掉它,因为它导致了很多误解和大量缓慢的代码编写。

© www.soinside.com 2019 - 2024. All rights reserved.