Возможная ошибка с hit.collider.gameObject.GetComponentInChildren? - PullRequest
0 голосов
/ 10 января 2019

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

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

Все отлично работает, кроме:

Fighting other = hit.collider.gameObject.GetComponentInChildren<Fighting>();

Debug.Log("Other:" + other); <- This line of code gives me this in Unity:

Другое: Обнаружение (борьба)
UnityEngine.Debug: Log (Object)
TankController: SetTargetPosition () (при
Активы / Игры / Chisana / Scripts / TankController.cs: 63)
TankController: обновление () (в разделе Активы / Игры / Чисана / Скрипты / TankController.cs: 27)

Ошибка, которую я получил в Unity:

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта TankController.SetTargetPosition () (в разделе Активы / Игры / Чисана / Скрипты / TankController.cs: 65) TankController.Update () (в разделе Активы / Игры / Чисана / Скрипты / TankController.cs: 27)

Весь код выглядит следующим образом:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TankController : MonoBehaviour
{

Vector3 targetPosition;
Vector3 lookAtTarget;
Quaternion playerRot;
float rotSpeed = 2;
float speed = 3;
bool moving = false;
public bool selected = false;

// Use this for initialization
//void Start()
//{

//}

// Update is called once per frame
void Update()
{
    if (Input.GetMouseButton(0))
    {
        SetTargetPosition();
    }
    if (moving)
        Move();
}

void SetTargetPosition()
{

    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, 1000))
        {

            if (hit.collider.CompareTag("Hittable") == true && selected == true)
            {
                Debug.Log("Found Ground");
                targetPosition = hit.point;
                lookAtTarget = new Vector3(targetPosition.x - transform.position.x,
                transform.position.y,
                targetPosition.z - transform.position.z);
                playerRot = Quaternion.LookRotation(lookAtTarget);
                moving = true;
            }

            if (hit.collider.CompareTag("Unit") == true)
            {

                Debug.Log("Found Unit");

                Fighting self = GetComponent<Fighting>();

                Fighting other = hit.collider.gameObject.GetComponentInChildren<Fighting>();

                Debug.Log("Other:" + other);

                if (self.Team == other.Team)
                {
                    if (selected == false)
                    {
                        selected = true;
                        Debug.Log("Selected");
                    }
                    if (selected == true)
                    {
                        selected = false;
                        Debug.Log("Deselected");
                    }
                }
            }

        }
    }
}

void Move()
{
    transform.rotation = Quaternion.Slerp(transform.rotation,
                                            playerRot,
                                            rotSpeed * Time.deltaTime);
    transform.position = Vector3.MoveTowards(transform.position,
                                            targetPosition,
                                            speed * Time.deltaTime);

    if (transform.position == targetPosition)
        moving = false;
}
}

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

Вместо этого, когда я нажимаю на объект, в консоли появляется ошибка, и объект не выделяется и, следовательно, не перемещается.

1 Ответ

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

Нулевая вещь - это не то, что вы отлаживаете. Logging:

Fighting self = GetComponent<Fighting>(); //this one is null
Fighting other = hit.collider.gameObject.GetComponentInChildren<Fighting>(); //this one isn't
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...