Hand Cubing Ответов: 1

2 сообщения об ошибках CS0029...


Я попытался добавить Raycast для съемки следуя учебнику на youtube но я все еще получаю 2 сообщения об ошибке CS0029 первое из которых гласит


Assets\Shooting.cs(19,30): ошибка CS0029: не удается неявно преобразовать тип 'bool' в 'UnityEngine.RaycastHit'


А второй говорит:


Assets\Shooting.cs(21,13): ошибка CS0029: не удается неявно преобразовать тип 'UnityEngine.RaycastHit' to 'bool'



вот мой сценарий



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

public class Shooting : MonoBehaviour
{
    public Transform firePoint;

    void Update() 
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Shoot();
        }
    }

    void Shoot()
    {
        RaycastHit hitInfo = Physics.Raycast(firePoint.position, firePoint.right);

        if (hitInfo)
        {
            Debug.Log(hitInfo.transform.name);
        }
    }
}


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

Я попытался найти орфографические ошибки, но у меня в основном тот же сценарий, что и в учебнике.

Sandeep Mewara

Публикация кода, вызывающего ошибку, была бы здесь более полезной. Поверьте, строка 15-25 из файла shooting.s должна быть достаточно хороша.

Hand Cubing

я случайно забыл опубликовать сценарий. Теперь я добавил его

Sandeep Mewara

Учебник может быть старым. Изучите использование IDE, intellisense в нем дал бы подсказку, если бы не ошибка о том, что такое тип возвращаемого метода.

1 Ответов

Рейтинг:
8

Sandeep Mewara

Вот, взгляните: Unity - Scripting API: физика.Raycast[^]
Physics.Raycast возвращает логический тип. Вы назначили это переменной типа RaycastHit и отсюда ошибка.

Он сразу же возвращает true, если луч пересекается с коллайдером, в противном случае false.

Таким образом,

void Shoot()
{
  if (Physics.Raycast(firePoint.position, firePoint.right))
  {
    // Ray intersects
  }
}

Пройдите через некоторые документы и статьи, чтобы узнать об этом, например:
Как создать Raycast в Unity 3D | Studica Blog[^]


ОБНОВЛЕНИЕ:
Образец для вас
void FixedUpdate()
    {
        // Bit shift the index of the layer (8) to get a bit mask
        int layerMask = 1 << 8;

        // This would cast rays only against colliders in layer 8.
        // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
        layerMask = ~layerMask;

        RaycastHit hit;
        // Does the ray intersect any objects excluding the player layer
        if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hit, Mathf.Infinity, layerMask))
        {
            Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
            Debug.Log("Did Hit");
        }
        else
        {
            Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * 1000, Color.white);
            Debug.Log("Did not Hit");
        }
    }

Ссылка: Unity - Scripting API: физика.Raycast[^]

Предложение: пожалуйста, пройдите по ссылке выше и приведите там примеры вместо того, чтобы пытаться следить за каким-то youtube. Пока вы не поймете основы и как использовать IDE, вам будет трудно следовать им.


Hand Cubing

Одно сообщение об ошибке исчезло, но первое все еще здесь

Assets\Shooting.cs(19,30): ошибка CS0029: не удается неявно преобразовать тип 'bool' в 'UnityEngine.RaycastHit'

Sandeep Mewara

кажется, твоя ошибка, по-прежнему указывая на линию: RaycastHit hitInfo = физика.Raycast(firePoint.position, firePoint.right);

Как правило, это неправильное назначение. делать:
bool hitInfo = физика.Raycast(firePoint.position, firePoint.right);

Кстати, с этим, отладка.Журнал(hitInfo.transform.name); будет неправильно. hitinfo будет просто логическим значением.

Sandeep Mewara

Обновленный ответ с примером и предложением.

Hand Cubing

Большое вам спасибо за то, что спасли мне жизнь :). Очень ценю вашу помощь!

Sandeep Mewara

Добро пожаловать.