Unity3d Unity 2D-如何在跑步游戏中设置障碍?

Unity3d Unity 2D-如何在跑步游戏中设置障碍?,unity3d,unity5,Unity3d,Unity5,我完成了跑步游戏。但我设置了这样的障碍: 这种方式使手机经常冻结。所以我制作了一个由障碍物组成的prefeb,如下所示: 我想使用函数SetActive(bool)显示/消失障碍物。最后,它的工作原理是我的跑步者处于静止状态,背景、障碍物、硬币、juwel被移动。但是我的创建者脚本有一个大问题 我的序言: 如您所见,此代码在两个障碍物预检杆之间创建空白(红色框)。我找不到问题。请帮我 创建者脚本: using UnityEngine; using System.Collections;

我完成了跑步游戏。但我设置了这样的障碍:

这种方式使手机经常冻结。所以我制作了一个由障碍物组成的prefeb,如下所示:

我想使用函数
SetActive(bool)
显示/消失障碍物。最后,它的工作原理是我的跑步者处于静止状态,背景、障碍物、硬币、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;
        }
    }
}
使用UnityEngine;
使用系统集合;
公共类CsPartCreator:MonoBehavior{
整数计数=1;
浮动定时器=0.0f;
//用于初始化
无效开始(){
for(int i=1;i<26;i++)//设置除第一个对象之外的所有对象都处于非活动状态(因为该对象首先被监视)
transform.GetChild(i).gameObject.SetActive(false);
}
//每帧调用一次更新
无效更新(){
timer+=Time.deltaTime;
如果(计时器>5f&&count<23)//每5秒一次,且计数小于预EB的数量
{
transform.GetChild(count).gameObject.SetActive(true)//
计数++;
定时器=0;
}
}
}
这是我的层次结构:


我认为,缺少的预置的Z值比背景更负,或者您使用了设置为背景后面的排序层

并检查所有障碍物游戏对象是否在Hirachy Part0、Part1、Part2、Part3中正确排序。如果顺序正确,请告诉我

请检查:)

使用UnityEngine;
使用系统集合;
使用System.Linq;
使用System.Collections.Generic;
公共类CsPartCreator:MonoBehavior
{
私人游戏对象玩家;
浮动定时器=0.0f;
私人名单障碍;
无效唤醒()
{
player=GameObject.FindWithTag(“player”);
障碍=新列表();
}
//用于初始化
void Start()
{
for(int i=0;i<26;i++)//设置除第一个对象之外的所有对象都处于非活动状态(因为该对象首先被监视)
{
添加(transform.GetChild(i.gameObject);
transform.GetChild(i).gameObject.SetActive(false);
}
}
//每帧调用一次更新
无效更新()
{
如果(障碍==null | |障碍。计数()==0)
返回;
var toActivate=障碍物。其中(x=>x.transform.position.x>transform.position.x&&x.transform.position.x
将玩家游戏对象设置为“玩家”标签,如下图所示

我认为,缺少的预置的Z值比背景更负,或者您使用了设置为背景后面的排序层

并检查所有障碍物游戏对象是否在Hirachy Part0、Part1、Part2、Part3中正确排序。如果顺序正确,请告诉我

请检查:)

使用UnityEngine;
使用系统集合;
使用System.Linq;
使用System.Collections.Generic;
公共类CsPartCreator:MonoBehavior
{
私人游戏对象玩家;
浮动定时器=0.0f;
私人名单障碍;
无效唤醒()
{
player=GameObject.FindWithTag(“player”);
障碍=新列表();
}
//用于初始化
void Start()
{
for(int i=0;i<26;i++)//设置除第一个对象之外的所有对象都处于非活动状态(因为该对象首先被监视)
{
添加(transform.GetChild(i.gameObject);
transform.GetChild(i).gameObject.SetActive(false);
}
}
//每帧调用一次更新
无效更新()
{
如果(障碍==null | |障碍。计数()==0)
返回;
var toActivate=障碍物。其中(x=>x.transform.position.x>transform.position.x&&x.transform.position.x
将玩家游戏对象设置为“玩家”标签,如下图所示

第一个障碍物是否放置在预制场的0,0,0中?@SteveJobs不,不是。您已经在场景中放置了这些预制场,您要做的是将这些预制场设置为在玩家行走时激活,对吗,或者这些预置是由另一个脚本实例化和放置的?@SteveJobs是的!我想:)有一个非常简单的方法,你可以激活或停用这些物体,给那些称为“障碍物”或其他东西的前置FB设置一个标记,然后检查它们是否重叠,或者,当玩家移动时,如果一条线击中了它们。第一个障碍物是否放置在预设中的0,0,0中?@SteveJobs不,不是。你已经在场景中放置了这些预设物,你要做的是在玩家行走时激活这些预设,对吗,或者这些预置是由另一个脚本实例化和放置的?@SteveJobs是的!我想:)有一个非常简单的方法,你可以激活或停用那些物体,给那些被称为“障碍物”或其他东西的前置FB设置一个标签,然后检查它们是否重叠在一个空间上,或者,如果一条线击中了它们,当玩家移动时。第0部分和第3部分仍然处于活动状态。。。但感谢您的详细解释和帮助!如果可能的话,你可以给我发一份你的项目的副本,如果不是太大的话,我会调查这个问题,让你知道到底发生了什么。哦,这次,当我将
transform.position.x
替换为
player.transform.position.x
时,所有部分都处于非活动状态。当玩家走向时,它不会激活游戏对象吗?我如何将我的项目发送给您?电子邮件?还是
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);
        }
    }
}