我正在构建一个游戏,除了在摧毁一个盒子的时候,是第一人称视角,然后是第三人称。
正在摧毁的盒子需要被打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);
}
}
你的问题就在这里。
// 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找到的第一个带有 "主摄像机 "标签的摄像机。
我个人认为应该去掉它,因为它导致了很多误解和大量缓慢的代码编写。