MRHals Gospodin Ответов: 2

Единство, основная камера нуль? Может ли кто-нибудь сказать мне, где моя ошибка?


Привет, опять же sry для того, чтобы спросить миллион раз о моем проекте, но мне нужно исправить эту проблему уже около месяца, и у меня все еще есть проблема с основной камерой, вызывающей у меня черный экран через некоторое время.

<pre>        private void DrawPlayers()
        {
            try
            {
                foreach (Player player in _players.Where(plr => plr != null))
                {
                    if (player == null)
                    {
                        File.WriteAllText("greske.txt", "Here we go with player null error.");
                        return;
                    }

                    if (player.Transform == null)
                    {
                        File.WriteAllText("greske.txt", "Player.Transform is null error");
                        return;
                    }
                    if (Camera.main == null)
                    {
                        File.WriteAllText("greske.txt", "Camera.main is null error");
                        return;
                    }

                    float distanceToObject = Vector3.Distance(Camera.main.transform.position, player.Transform.position);
                    Vector3 playerBoundingVector = new Vector3(Camera.main.WorldToScreenPoint(player.Transform.position).x, Camera.main.WorldToScreenPoint(player.Transform.position).y);

                    if (distanceToObject <= _maxDrawingDistance && playerBoundingVector.z > 0.01 && playerBoundingVector.x > -5 && playerBoundingVector.y > -5 && playerBoundingVector.x < 1920 && playerBoundingVector.y < 1080)
                    {
                        var playerHeadVector = new Vector3(
                            Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).x,
                            Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).y,
                            Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).z);

                        float boxVectorX = Camera.main.WorldToScreenPoint(player.Transform.position).x;
                        float boxVectorY = Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).y + 10f;
                        float boxHeight = Math.Abs(Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position).y - Camera.main.WorldToScreenPoint(player.Transform.position).y) + 10f;
                        float boxWidth = boxHeight * 0.65f;

                        Color guiBackup = GUI.color;
                        var playerColor = GetPlayerColor(player.Side);
                        var isAi = player.Profile.Info.RegistrationDate <= 0;
                        var deadcolor = player.HealthController.IsAlive ? playerColor : Color.gray;

                        GUI.color = deadcolor;
                        GuiHelper.DrawBox(boxVectorX - boxWidth / 2f, (float)Screen.height - boxVectorY, boxWidth, boxHeight, deadcolor);
                        GuiHelper.DrawLine(new Vector2(playerHeadVector.x - 2f, (float)Screen.height - playerHeadVector.y), new Vector2(playerHeadVector.x + 2f, (float)Screen.height - playerHeadVector.y), deadcolor);
                        GuiHelper.DrawLine(new Vector2(playerHeadVector.x, (float)Screen.height - playerHeadVector.y - 2f), new Vector2(playerHeadVector.x, (float)Screen.height - playerHeadVector.y + 2f), deadcolor);


                        var playerName = isAi ? "[BOT]" : player.Profile.Info.Nickname;
                        string playerDisplayName = player.HealthController.IsAlive ? playerName : playerName + " [MRTAV]";
                        string playerText = $"{playerDisplayName} [{(int)distanceToObject}]M";

                        var playerTextVector = GUI.skin.GetStyle(playerText).CalcSize(new GUIContent(playerText));
                        GUI.Label(new Rect(playerBoundingVector.x - playerTextVector.x / 2f, (float)Screen.height - boxVectorY - 20f, 300f, 50f), playerText);
                        GUI.color = guiBackup;
                    }
                }
            }
            catch (Exception ex)
            {
                File.WriteAllText("greske.txt", ex.ToString());
            }
        }


Что я уже пробовал:

- Отладка вообще без ошибок. (Тоже свой .DLL-файл)
- Попробуй поймать и найти свою камеру.главная проблема ИДК почему.
- попробуйте кэшировать
- попробуйте получить доступ к FindObject

2 Ответов

Рейтинг:
2

Kris Lantz

Если ваша камера становится нулевой, то сама Unity должна жаловаться в своем журнале ошибок, а не требовать того, что вы там делаете. Я и сам не уверен, что доверяю результатам...
С этим я нахожу интересным,

Цитата:
черный экран через некоторое время
Работает ли камера, а потом нет? Если это является работая изначально, какие условия приводят к тому, что она в конечном итоге сводится на нет? Есть ли у вашего кода доступ к этой камере?
Существует целый ряд вопросов и возможностей для рассмотрения, и пример кода не особенно полезен.

Что является полезно делать то, что предложил Грифф, и использовать отладчик. Если вы не понимаете, как (мы все были там), потратьте некоторое время, чтобы понять это. Поступая таким образом и собирая результаты, вы либо:
А) выясните это сами и учитесь по пути.
Б) дайте людям, к которым вы обращаетесь за помощью, информацию, чтобы лучше помочь им помочь вам.


Рейтинг:
0

OriginalGriff

Если Camera.main если это null, то просто загрузите его в отладчик (и не имеет значения, является ли это dll или exe, отладчик будет работать нормально), а затем просто выясните, что это не поможет вам - проблема не в этом коде, а в коде, который был выполнен за некоторое время до этого кода.

Если вы получаете null, то вам нужно выяснить, почему: а это значит, что с помощью отладчика можно отследить хотя бы ваш код, чтобы узнать, что именно он делает: это не "волшебное программное обеспечение", которое при загрузке сразу же говорит "Здесь есть проблема с вашей логикой". Отладчик - это инструмент, который позволяет вам проверить, что делает ваш код во время выполнения, он не показывает вам ошибок, он показывает вам, что происходит, чтобы вы могли определить, какой код не делает то, что вы ожидали.
Так сказать, "отладка вообще не ошибка. (Тоже свой .dll-файл)" означает, что вы не используете его должным образом. И сказать "попробуйте поймать и найти его камеру.главная проблема idk why." также не полезно - Так как вам нужно посмотреть, что должно быть установлено в что-то другое, чем null, чтобы узнать, что либо не выполняется, либо загружается неправильное значение.

И мне очень жаль, но мы не можем сделать ничего из этого для вас: у нас нет вашего кода, у нас нет данных, которые он использует, мы не знаем, как доставить его туда, где возникает проблема, и мы даже не знаем, чего вы ожидаете от него!
Поэтому Загрузите свое приложение в отладчик и начните использовать его как инструмент вместо того, чтобы говорить "это не работает" - только вы можете это сделать!


MRHals Gospodin

Я привязан к процессу от игры с брейк-пойнтами, но его хитинг и ничего больше... и что теперь?

OriginalGriff

Если он попадет в точки останова, вот и вся идея! Затем вы отвечаете за свои переменные и можете просмотреть их, выполнить один шаг кода, изменить, какая строка выполняется следующей, даже отредактировать ее и продолжить оттуда.

Как я уже сказал, "это не" волшебное программное обеспечение", которое, когда вы загружаете его, сразу же говорит:"Здесь есть проблема с вашей логикой". Отладчик-это инструмент, который позволяет вам исследовать, что делает ваш код во время его выполнения'
Он позволяет вам узнать, что происходит, и интерпретация этого зависит от вас - отладчик имеет не больше представления о том, что пытается сделать все ваше приложение (а тем более крошечный фрагмент кода, который вы показываете), чем я!
Это как если бы ваша машина остановилась на автостраде - двигатель заглох, вот почему машина остановилась (камера.Основным является нулем). Но что же случилось, что двигатель заглох? Неужели у него кончилось топливо? Вы заправили его не тем топливом? Вы наполнили топливный бак патокой? Может, он перегрелся? Может быть, он врезался в кирпичную стену в очень неожиданном месте? Может быть, сигнальная лампа двигателя, которая загорелась неделю назад, имеет к этому какое-то отношение? Отладка - это процесс выяснения того, что вызвало проблему, которую вы заметили, и точно так же, как "остановленный автомобиль", вы должны оглянуться назад от "точки неисправности", чтобы понять, что привело к тому, что проблема стала заметной.

Поэтому выясните, где он должен быть установлен в значение, и остановите его. А в него попадут? Если да, то что же это за установка? Если нет, то почему бы и нет?
Отладка-это навык, и вы развиваете его только с его помощью. Подумайте о своем коде и о том, какой путь(Ы) он прошел, чтобы добраться до точки, где он показывает проблему.

MRHals Gospodin

Я не эксперт в отладке, можете ли вы дать мне некоторые подсказки, или, по крайней мере, вы пытаетесь отладить мою программу am может отправить вам материал, который вы пытаетесь найти в строке, что я вызываю мои проблемы в течение 1 месяца..

OriginalGriff

Нет - я не могу отладить вашу программу для вас - прочитайте, что я сказал выше!

Google для "Visual Studio" и "Debugger", и вы найдете много материала о том, как его использовать. Фактическое использование и "знание того, где искать и на что смотреть" зависит от знания вашего кода - а вы написали его так, что должны знать его и как он должен работать, - плюс знание того, когда что-то не то, что должно быть.

Дай ему попробовать. Это навык - и тот, который вы действительно должны были развить задолго до этого ... без него далеко не уйдешь!