У меня нет синтаксических ошибок в Unity. Как я могу найти ошибки, чтобы узнать, почему мое перекрестие остается в центре экрана? - PullRequest
0 голосов
/ 25 января 2019

Для Unity Game: разве перекрестие не должно двигаться соответствующим образом, как это делает игрок, чтобы указать на врагов? как найти ошибку без синтаксических сообщений об ошибках?

Я пытался посещать форумы Unity. Я нашел поддержку по поводу радиопередачи, следуя указаниям, добавив код в скрипт crosshair.cs. Синтаксических ошибок нет.

public class CrossHair: MonoBehaviour{

[SerializeField] private GameObject standardCross;
[SerializeField] private GameObject redCross;

float moveForce = 1.0f;
float rotateTorque = 1.0f;
float hoverHeight = 4.0f;
float hoverForce = 5.0f;
float hoverDamp = 0.5f;

Rigidbody rb;
private RaycastHit raycastHit;
void Start()

{

    standardCross.gameObject.SetActive(true);
    rb = GetComponent<Rigidbody>();

    // Fairly high drag makes the object easier to control.
    rb.drag = 0.5f;
    rb.angularDrag = 0.5f;
}

void Update()

{
// Push/turn the object based on arrow key input.
rb.AddForce(Input.GetAxis("Vertical") * moveForce * transform.forward);
rb.AddTorque(Input.GetAxis("Horizontal") * rotateTorque * Vector3.up);

    RaycastHit hit;
    Ray downRay = new Ray(transform.position, -Vector3.up)
    if (Physics.Raycast(downRay, out hit))
    {
 //The "error" in height is the difference between the desired height
        // and the height measured by the raycast distance.
        float hoverError = hoverHeight - hit.distance;

       // Only apply a lifting force if the object is too low (ie, let
        // gravity pull it downward if it is too high).
        if (hoverError > 0)
        {
        // Subtract the damping from the lifting force and apply it to
        // the rigidbody.
      float upwardSpeed = rb.velocity.y;
      float lift = hoverError * hoverForce - upwardSpeed * hoverDamp;
      rb.AddForce(lift * Vector3.up);
     }
}
Ray targettingRay = new Ray(transform.position, transform.forward)

    if (Physics.Raycast(targettingRay, out raycastHit, 100))
    {
        if (raycastHit.transform.tag == "Enemies")

        {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            redCross.gameObject.SetActive(true);
            standardCross.gameObject.SetActive(false);
        }
    }

    else

    {
        redCross.gameObject.SetActive(false);
        standardCross.gameObject.SetActive(true);
    }
}
}

Я, за исключением перекрестия в моей игре, следил за камерой, установленной игроком, как объясняет код. Любое руководство приветствуется.

1 Ответ

0 голосов
/ 25 января 2019

Синтаксические ошибки - это те ошибки, которые вообще не позволяют вашей игре / программе работать.Они похожи на грамматические ошибки, которые нужно исправить перед тем, как вы сможете запустить свой код.

Синтаксическая ошибка - ваш компьютер говорит вам:

Я не могу запустить это, потому что я неНе понимаю. или Я не могу запустить это, потому что это не разрешено.

Одним из примеров будет int x = "Hello World".Это недопустимо, потому что я не могу присвоить строковое значение целому числу (например).

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

Хороший и простойспособ отладки вашего кода в Unity заключается в добавлении операторов Debug.Log("My Log Message"); в ваш код, если вы считаете, что это будет полезно.Они будут записаны на выход вашей консоли в Unity, пока вы находитесь в режиме воспроизведения.Например, вы можете сделать что-то подобное, чтобы постоянно регистрировать положение и поворот вашего креста:

Debug.Log("Cross Position: " + standardCross.transform.position);
Debug.Log("Cross Rotation: " + standardCross.transform.rotation);

Просто обязательно удалите их, как только закончите с ними, потому что наличие Debug.Logs в вашем коде требует значительных усилий.ударить по производительности.

Еще один, более сложный способ отладки вашего кода - использование точек останова в Visual Studio или любой IDE / Editor, которую вы используете.В основном это сводится к объявлению точек, в которых ваша программа должна приостановить выполнение, чтобы вы смотрели на значения в самой вашей программе.Это довольно удобно, но выходит за рамки того, что я мог бы рассказать вам в этом тексте, поэтому, пожалуйста, взгляните на этот пример использования для Unity: Отладка игр Unity с помощью Visual Studio

Теперь к вашему коду:

Первое: есть Vector3.down, поэтому вам не нужно использовать -Vector3.up.

Второе: вам нужен GameObject каккрестик?Почему бы просто не добавить вместо этого UI-Crosshair?Таким образом, он всегда остается в центре экрана, где бы вы ни поворачивали камеру.

Просто добавьте новое изображение в свой пользовательский интерфейс через GameObject -> UI -> Image, придайте ему вид перекрестия в инспектореи заблокируйте его в середине экрана, щелкнув левой кнопкой мыши на маленьком перекрестии в верхнем левом углу Инспектора, пока у вас выбрано ваше изображение, а затем нажмите Shift + Alt + щелчок левой кнопкой мыши по средней опции.

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...