如何在 Unity AR 基础中只生成一个对象
How to spawn only one object in Unity AR foundation
我是 Unity 和 C# 的新手,有人可以帮助我吗?我正在创建一个儿童游戏,当他们环顾四周时,他们往往会不小心点击屏幕,但随后他们会再次生成该对象,并且它会覆盖第一个对象。我只想在我触摸屏幕对象时生成它们。对不起我的英语。
谢谢
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class ProgrammManager : MonoBehaviour
{
[Header("Put your planeMarker here")]
[SerializeField] private GameObject PlaneMarkerPrefab;
private ARRaycastManager ARRaycastManagerScript;
private Vector2 TouchPosition;
public GameObject ObjectToSpawn;
void Start()
{
ARRaycastManagerScript = FindObjectOfType<ARRaycastManager>();
PlaneMarkerPrefab.SetActive(false);
}
void Update()
{
ShowMarker();
}
void ShowMarker()
{
List<ARRaycastHit> hits = new List<ARRaycastHit>();
ARRaycastManagerScript.Raycast(new Vector2(Screen.width / 2, Screen.height / 2), hits, TrackableType.Planes);
if (hits.Count > 0)
{
PlaneMarkerPrefab.transform.position = hits[0].pose.position;
PlaneMarkerPrefab.SetActive(true);
}
if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
{
Instantiate(ObjectToSpawn, hits[0].pose.position, ObjectToSpawn.transform.rotation);
}
}
}
如果您只想生成一次对象,可以在脚本中添加一个布尔检查。
private bool objectSpawned = false;
然后在生成对象时将 bool 设置为 true。
if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
{
Instantiate(ObjectToSpawn, hits[0].pose.position, ObjectToSpawn.transform.rotation);
objectSpawned = true;
}
现在,您将支票插入 Update() 函数。这样,如果您已经生成了一个对象,您将无法再生成。
void Update()
{
if(!objectSpawned)
{
ShowMarker();
}
}
我是 Unity 和 C# 的新手,有人可以帮助我吗?我正在创建一个儿童游戏,当他们环顾四周时,他们往往会不小心点击屏幕,但随后他们会再次生成该对象,并且它会覆盖第一个对象。我只想在我触摸屏幕对象时生成它们。对不起我的英语。 谢谢
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class ProgrammManager : MonoBehaviour
{
[Header("Put your planeMarker here")]
[SerializeField] private GameObject PlaneMarkerPrefab;
private ARRaycastManager ARRaycastManagerScript;
private Vector2 TouchPosition;
public GameObject ObjectToSpawn;
void Start()
{
ARRaycastManagerScript = FindObjectOfType<ARRaycastManager>();
PlaneMarkerPrefab.SetActive(false);
}
void Update()
{
ShowMarker();
}
void ShowMarker()
{
List<ARRaycastHit> hits = new List<ARRaycastHit>();
ARRaycastManagerScript.Raycast(new Vector2(Screen.width / 2, Screen.height / 2), hits, TrackableType.Planes);
if (hits.Count > 0)
{
PlaneMarkerPrefab.transform.position = hits[0].pose.position;
PlaneMarkerPrefab.SetActive(true);
}
if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
{
Instantiate(ObjectToSpawn, hits[0].pose.position, ObjectToSpawn.transform.rotation);
}
}
}
如果您只想生成一次对象,可以在脚本中添加一个布尔检查。
private bool objectSpawned = false;
然后在生成对象时将 bool 设置为 true。
if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
{
Instantiate(ObjectToSpawn, hits[0].pose.position, ObjectToSpawn.transform.rotation);
objectSpawned = true;
}
现在,您将支票插入 Update() 函数。这样,如果您已经生成了一个对象,您将无法再生成。
void Update()
{
if(!objectSpawned)
{
ShowMarker();
}
}