Unity 2D - 如何在 运行 游戏中放置障碍物?
Unity 2D - How to place obstacle in Running game?
我完成了 运行 游戏。但我这样设置了障碍:
这种方式使得phone经常冻结。所以我做了一个prefeb,它是由这样的障碍对象组成的:
我想用函数SetActive(bool)
来appear/disappear障碍。最后,它的工作原理是我的跑步者处于静止状态,背景、障碍物、硬币、juwel 被移动。但是我的创作者脚本有一个大问题。
我的问题:
如您所见,这段代码在两个障碍物预置之间创建了空白(红色框)。我找不到问题。请帮助我...
创作者脚本:
using UnityEngine;
using System.Collections;
public class CsPartCreator : MonoBehaviour {
int count = 1;
float timer = 0.0f;
// Use this for initialization
void Start () {
for (int i = 1; i < 26; i++)//set Deactive all object excluding first object (Because This object is watched at first.)
transform.GetChild(i).gameObject.SetActive(false);
}
// Update is called once per frame
void Update () {
timer += Time.deltaTime;
if (timer > 5f && count < 23)//every 5 seconds and count is smaller than the number of prefeb
{
transform.GetChild(count).gameObject.SetActive(true);//
count++;
timer = 0;
}
}
}
这是我的层次结构:
我认为,缺少预制件的Z值比背景更负,或者您使用了设置在背景后面的排序层。
然后检查 Hirachy Part0、Part1、Part2、Part3 中的所有障碍游戏对象是否正确排序。让我知道这些顺序是否正确
请检查:)
using UnityEngine;
using System.Collections;
using System.Linq;
using System.Collections.Generic;
public class CsPartCreator : MonoBehaviour
{
private GameObject player;
float timer = 0.0f;
private List<GameObject> obstacles;
void Awake()
{
player = GameObject.FindWithTag("Player");
obstacles = new List<GameObject>();
}
// Use this for initialization
void Start()
{
for (int i = 0; i < 26; i++)//set Deactive all object excluding first object (Because This object is watched at first.)
{
obstacles.Add(transform.GetChild(i).gameObject);
transform.GetChild(i).gameObject.SetActive(false);
}
}
// Update is called once per frame
void Update()
{
if (obstacles == null || obstacles.Count() == 0)
return;
var toActivate = obstacles.Where(x => x.transform.position.x > transform.position.x && x.transform.position.x < transform.position.x + 10).ToList(); // +10 is the range
foreach (GameObject go in toActivate)
{
go.SetActive(true);
obstacles.Remove(go);
}
}
}
将玩家游戏对象设置为 "Player" 标签,如下图所示
我完成了 运行 游戏。但我这样设置了障碍:
这种方式使得phone经常冻结。所以我做了一个prefeb,它是由这样的障碍对象组成的:
我想用函数SetActive(bool)
来appear/disappear障碍。最后,它的工作原理是我的跑步者处于静止状态,背景、障碍物、硬币、juwel 被移动。但是我的创作者脚本有一个大问题。
我的问题:
如您所见,这段代码在两个障碍物预置之间创建了空白(红色框)。我找不到问题。请帮助我...
创作者脚本:
using UnityEngine;
using System.Collections;
public class CsPartCreator : MonoBehaviour {
int count = 1;
float timer = 0.0f;
// Use this for initialization
void Start () {
for (int i = 1; i < 26; i++)//set Deactive all object excluding first object (Because This object is watched at first.)
transform.GetChild(i).gameObject.SetActive(false);
}
// Update is called once per frame
void Update () {
timer += Time.deltaTime;
if (timer > 5f && count < 23)//every 5 seconds and count is smaller than the number of prefeb
{
transform.GetChild(count).gameObject.SetActive(true);//
count++;
timer = 0;
}
}
}
这是我的层次结构:
我认为,缺少预制件的Z值比背景更负,或者您使用了设置在背景后面的排序层。
然后检查 Hirachy Part0、Part1、Part2、Part3 中的所有障碍游戏对象是否正确排序。让我知道这些顺序是否正确
请检查:)
using UnityEngine;
using System.Collections;
using System.Linq;
using System.Collections.Generic;
public class CsPartCreator : MonoBehaviour
{
private GameObject player;
float timer = 0.0f;
private List<GameObject> obstacles;
void Awake()
{
player = GameObject.FindWithTag("Player");
obstacles = new List<GameObject>();
}
// Use this for initialization
void Start()
{
for (int i = 0; i < 26; i++)//set Deactive all object excluding first object (Because This object is watched at first.)
{
obstacles.Add(transform.GetChild(i).gameObject);
transform.GetChild(i).gameObject.SetActive(false);
}
}
// Update is called once per frame
void Update()
{
if (obstacles == null || obstacles.Count() == 0)
return;
var toActivate = obstacles.Where(x => x.transform.position.x > transform.position.x && x.transform.position.x < transform.position.x + 10).ToList(); // +10 is the range
foreach (GameObject go in toActivate)
{
go.SetActive(true);
obstacles.Remove(go);
}
}
}
将玩家游戏对象设置为 "Player" 标签,如下图所示