RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1088464
Accepted
danil2283376
danil2283376
Asked:2020-02-28 14:23:07 +0000 UTC2020-02-28 14:23:07 +0000 UTC 2020-02-28 14:23:07 +0000 UTC

我正在尝试循环游戏的背景,当我尝试从左到右移动对象的位置时,它会出错

  • 772

当脚本启动时,我用脚本附加到的对象的子项填充 List,然后在 Update 方法中我尝试找出 1 个元素是否已移到相机后面的左侧,然后检查它是否是正在绘制,之后我得到列表的最后一个元素,找出它的位置并传递 1 个已经离开相机的元素,场景中最后一个元素的位置,以便它出现在它后面,之后我删除 1元素并将其添加到列表的末尾。但是一切都不行,或许还有别的方法可以循环后台,请大家帮忙

[![][一]

public class LoopBackGround : MonoBehaviour
{
    public Vector2 speed = new Vector2 (10, 10);
    public Vector2 direction = new Vector2 (-1, 0);
    private List<Transform> backgroundPart; // все дети которые пренадлежат элементe на который присоединил скрипт
    public bool isLooping = false;
    public bool isCamera = false;
    private int steps = 0;

    private void Start()
    {
        if (isLooping) // надо ли элемент зациклить
        {
            backgroundPart = new List<Transform>(); // инициализирую List

            for (int i = 0; i < gameObject.transform.childCount; i++)
            {
                Transform child = transform.GetChild(i);// получая ребенка элемента

                if (child.GetComponent<Renderer>() != null) // узнаю есть ли у него компонент рендера
                {
                    backgroundPart.Add(child);// добавляю в List
                }
            }
            backgroundPart = backgroundPart.OrderBy(t => t.position.x).ToList();
        }
    }

    private void Update()
    {
        Vector3 move = new Vector3(speed.x * direction.x, speed.y * direction.y, 0); // задаю движение элементу
        move *= Time.deltaTime; // Умножаю ее на скорость отрисовки кадра
        transform.Translate(move); // Передвигаю элемент

        if (isCamera) // Это камера ?
            Camera.main.transform.Translate(move);  // Если да то двигаю камеру

        if (isLooping) // Элемент надо зациклить ?
        {
            /*Vector3 cam = Camera.main.transform.position;*/ // Узнаю координаты камеры
            Transform firstChild = backgroundPart.FirstOrDefault(); // получаю 1 элемент
            if (firstChild != null) // узнаю не пустой ли 1 элемент
            {
                for (int i = 0; i < backgroundPart.Count; i++)
                {
                    if ((firstChild.position.x + 20) < Camera.main.transform.position.x) // проверяю ушел ли объект налево
                    {

                        if (firstChild.GetComponent<Renderer>().isVisible == false)
                        {
                            print(firstChild.gameObject.name);
                            Transform lastChild = backgroundPart.LastOrDefault(); // получаю последний объект List
                            print(lastChild.gameObject.name);
                            firstChild.transform.Translate(new Vector3(lastChild.position.x, lastChild.position.y, lastChild.position.z)); // получаю место нахождение последнего элемента и передаю его первому
                            backgroundPart.Add(firstChild); // добавляю в List первый элемент
                            backgroundPart.Remove(firstChild); // удаляю первый элемент что бы двигать список справо налево

                            //print(backgroundPart[i].gameObject.name);
                            //lastElem = new Vector3(gameObjects.LastOrDefault().transform.position.x + 40, 0, 0);
                            //Transform first = gameObjects.FirstOrDefault(); // передаю элемент который ушел налево

                         //gameObjects[i].transform.Translate(lastElem); // Переношу элемент направо
                            //gameObjects.Add(first); // Добавляю первый элемент в конец
                            //gameObjects.Remove(first); // Удаляю первый элемент

                        //Transform lastChild = backgroundPart.LastOrDefault();
                        //Vector3 lastPosition = new Vector3(lastChild.transform.position.x, lastChild.transform.position.y, lastChild.transform.position.z);
                        //Vector3 lastSize = (lastChild.GetComponent<Renderer>().bounds.max - lastChild.GetComponent<Renderer>().bounds.min);

                        //firstChild.position = new Vector3(lastPosition.x + lastSize.x, firstChild.position.y, firstChild.position.z);
                        //backgroundPart.Remove(firstChild);
                        //backgroundPart.Add(firstChild);
                        }
                    }
                }
            }
        }
        steps++;
        print($"{steps}) Проверка порядка элементов!");
        for (int i = 0; i < backgroundPart.Count; i++)
        {
            print(backgroundPart[i].gameObject.name);
        }
        // СПИСОК НЕ ОБНОВЛЯЕТСЯ, 1 ЭЛЕМЕНТ ПЕРЕНОСИТСЯ В КОНЕЦ ОСТАЛЬНЫЕ НЕ ПЕРЕНОСЯТСЯ
    }
}
c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Yaroslav
    2020-02-29T01:14:16Z2020-02-29T01:14:16Z
    Transform firstChild = backgroundPart.FirstOrDefault(); // получаю 1 элемент
    // - Берёте первый элемент из List
    ...
    backgroundPart.Add(firstChild); // добавляю в List первый элемент
    // - Добавляю в List ранее взятый элемент (который тау уже есть)
    backgroundPart.Remove(firstChild); // удаляю первый элемент что бы двигать список справо налево
    // - Удаляете только что добавленный элемент
    

    呼叫03!

    transform.Translate(move); // Передвигаю элемент
    // - Какой элемент? Это корневой GameObject
    if (isCamera) // Это камера ?
        Camera.main.transform.Translate(move); // Если да то двигаю камеру
    // - Одно другому не мешает?
    

    如果isLooping false同样成功,您可以愚蠢地禁用脚本。

    isCamera? 相机在这里做什么?剧本不是关于她的行为!再一次,同样的成功......

    public class CameraMovement : MonoBehaviour {
        public float Speed = 10f;
        public Vector2 Direction = new Vector2 (-1, 0);
    
        private void Update () {
            Camera.main.transform.Translate(Direction*Speed*Time.deltaTime); // Да так можно! Vector2*float
        }
    }
    
    public class LoopBackGround : MonoBehaviour {
        public List<Transform> _elements;
        private float _elementWidth = 20; // Ширина элемента
        private float _halfFrameWidth; // Полавина ширина камеры
    
        private void Start () {
            _halfFrameWidth = 20; // Не помню как определять, как нибудь сам...
            _elements = new List<Transform>();
            for (int i = 0; i < gameObject.transform.childCount; i++) {
                Transform child = transform.GetChild(i);
                if (child.GetComponent<Renderer>() != null)
                    _elements.Add(child);
            }
            _elements = _elements.OrderBy(t => t.position.x);
        }
    
        private void Update () {
            Vector2 CameraPosition = Camera.main.transform.position;
            int Count = _elements.Count;
            int TotalElements = Mathf.FloorToInt((CameraPosition.x-_halfFrameWidth)/_elementWidth); // Сколько элементов от x0 до левой части камеры
            for (int i = 0; i < Count; i++) { // Выстраиваем элементы под катр
                int ElementNum = TotalElements+i; // Номер элемента i от х0
                int NumOnList = ElementNum%Count; // Номер элемента в кадре (% - остаток от деления)
                if (NumOnList < 0)
                    NumOnList += Count;
                _elements[NumOnList].localPosition = new Vector3(ElementNum*_elementWidth, CameraPosition.y, 0);
            }
        }
    }
    
    • 1
  2. Best Answer
    danil2283376
    2020-03-01T19:08:47Z2020-03-01T19:08:47Z

    我自己决定,我理解这个人的批评,我在单独的脚本中使用相机的运动。最后,我决定自己去挑战。谢谢您的帮助 !

    这是代码:

         `
    public class Loop : MonoBehaviour
    {
        public Vector2 speed = new Vector2(10, 10);
        public Vector2 direction = new Vector2(-1, 0);
        public bool isLooping = false;
    
        private List<Transform> backgroundPart;
    
        private void Start()
        {
            // Корневую пустышку нужно зациклить?
            if (isLooping)
            {
                // инициализирую список
                backgroundPart = new List<Transform>();
                for (int i = 0; i < transform.childCount; i++)
                {
                    // получаю ребенка у корневого объекта
                    Transform child = transform.GetChild(i);
                    // проверяю есть ли у него объект рендерера
                    if (child.GetComponent<Renderer>() != null)
                        backgroundPart.Add(child);
                }
                // выполняю сортировку по x кто левее тот первый в списке
                backgroundPart = backgroundPart.OrderBy(t => t.position.x).ToList();
            }
        }
    
        private void Update()
        {
            Vector3 move = new Vector3(speed.x * direction.x, speed.y * direction.y, 0); // движение корневого объекта
            move *= Time.deltaTime; // движение умножаю на скорость отрисовки кадра
            transform.Translate(move); // задаю движение корневому объекту
    
            if (isLooping) // корневой объект зацикленный
            {
                // узнаю координаты камеры
                Vector3 pointCamera = Camera.main.transform.position;
                // получаю последний объекта списка
                Transform firstChild = backgroundPart.FirstOrDefault();
                // проверяю есть ли ссылка на объект
                if (firstChild != null)
                {
                    // Проверяю ушел ли объект налево
                    if ((pointCamera.x - 20) > firstChild.transform.position.x)
                    {
                        // получаю последний объект списка
                        Transform lastChild = backgroundPart.LastOrDefault();
                        // вычитаю из последнего расстояние по x до первого элемента
                        Vector2 distance = new Vector2(lastChild.position.x - firstChild.position.x, 0);
                        // Vector3 с дефолтными значениями
                        Vector3 bias = default;
                        // узнаю объект является ли платформой
                        if (transform.gameObject.tag == "Platform")
                        {
                            // передаю значения
                            bias = new Vector3(firstChild.position.x + 50, Random.Range(-5, 5));
                            // двигаю элементы
                            firstChild.position = bias;
                        }
                        else if (transform.gameObject.tag == "Background")
                        {
                            bias = new Vector3(distance.x + 20, firstChild.transform.position.y, firstChild.position.z);
                            firstChild.transform.Translate(bias);
                        }
                        // удаляю найденный объект
                        backgroundPart.Remove(firstChild);
                        // добавляю нужный объект в конец списка
                        backgroundPart.Add(firstChild);
                    }
                }
            }
        }
    }`
    
    • 0

相关问题

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5