Итак, в общем, я пытаюсь изменить сценарий, чтобы при нажатии на объект луч попадал на объект, искал компонент в дочерних элементах и делал его пригодным для использования, чтобы на него можно было ссылаться позже, если это смысл. Я могу уточнить дальше, так что не бойтесь комментировать.
Я пытался исследовать эту проблему и не нашел ничего, что могло бы помочь мне в этой ситуации. Я также видел другие посты, упоминающие, что это может быть возможной ошибкой. Я не уверен, действительно ли это ошибка или я просто делаю что-то не так.
Все отлично работает, кроме:
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;
}
}
Результат этого кода должен состоять в том, что когда я щелкаю по объекту, он должен выбирать этот объект, а затем, если я щелкаю по нему снова, он должен быть отменен. Когда выбран, он должен идти туда, куда я нажимаю, и ничего не делать, пока не выбран.
Вместо этого, когда я нажимаю на объект, в консоли появляется ошибка, и объект не выделяется и, следовательно, не перемещается.