Как исправить ошибку «Невозможно неявно преобразовать тип 'float' в 'UnityEngine.GameObject'»?

Я пытаюсь получить переменную с плавающей запятой из скрипта PlayerHealth.cs и использовать ее в скрипте LightLevel, но получаю сообщение об ошибке Cannot implicitly convert type 'float' to 'UnityEngine.GameObject' в строке 23. Я не знаю, что делать, чтобы это исправить.

Я также объясняю, что я пытаюсь сделать в верхней части скрипта LightLevel.cs, если это необходимо.

LightLevel.cs:

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

// This script is meant to get the health variable from the 'PlayerHealth.cs' script and change it to
// Intensity of the light this script is on, meaning lower the health, lower the light intensity.
// However, it's giving this error message:

// Assets\scripts\LightLevel.cs(23,18): error CS0029: Cannot implicitly convert type 'float' to 'UnityEngine.GameObject'

// How would I fix this?

public class LightLevel : MonoBehaviour
{
    public GameObject player;

    Light myLight;

    public float LevelOfLight2;
    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.Find("Player").GetComponent<PlayerHealth>().Health; // <- offending line of code
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("light level is : " + LevelOfLight2);
        myLight.intensity = LevelOfLight2 + 27f;
    }
}

PlayerHealth.cs:

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

// everything in this script is working

public class PlayerHealth : MonoBehaviour
{
    // All variables
    [SerializeField] private Transform player;
    [SerializeField] private LayerMask HurtLayer;
    public float MaxHealth = 6f;
    public float IFrame = 1f;
    private float IFrameTime = 0f;
    private bool AllowDamage = false;
    private float ActualIFrame = 0f;
    public float Health = 6f;
    public float LevelOfLight = 0f; // <- The variable I want to access from "LightLevel.cs" script
    // Set health to the max and do the math for I-frames
    void Start()
    {
        Health = MaxHealth;

        ActualIFrame = IFrame * 6f;
    }

    // Update is called once per frame
    void Update()
    {
        // Every frame increase IFrameTime by 0.1
        IFrameTime = IFrameTime += 0.1f;

        // If i-frame counter is higher than teh set amount, and the player is touching hurt collider, take damage.
        if (ActualIFrame < IFrameTime && hurt())
        {
            Debug.Log("ouch");
            Health = Health - 1f;
            IFrameTime = 0f;
        }

        // If the player's health runs out, display message "ded"
        if (Health == 0f)
        {
            Debug.Log("ded");
        }
    }

    // Detects if the player's collider is touching the collider of something that damages.
    private bool hurt()
    {
        return Physics2D.IsTouchingLayers(player.GetComponent<Collider2D>(), HurtLayer);
    }
}

Я попытался сделать строку кода:

player = GameObject.Find("Player").GetComponent<PlayerHealth>().Health;

К:

GameObject.Find("Player").GetComponent<PlayerHealth>().Health;

Однако он просто выдал другое сообщение об ошибке.

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

Morion 30.03.2023 12:53

в скрипте «LightLevel» мне нужна переменная здоровья из скрипта «playerHealth» в виде числа с плавающей запятой, поэтому я могу изменить интенсивность света на это значение

UltraAce 30.03.2023 12:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка говорит вам о том, что у вас есть float, и вы пытаетесь назначить его чему-то, что не подходит для удержания поплавка (в данном случае, GameObject)

В этой строке вы говорите, что Unity player — это GameObject (обычный объект Unity с преобразованием, позицией, именем, некоторыми прикрепленными скриптами и т. д.).

public GameObject player;

И в этой строке вы говорите единству взять значение здоровья и заменить им текущий объект player...

player = GameObject.Find("Player").GetComponent<PlayerHealth>().Health; // <- offending line of code

Поскольку player — это GameObject, он не может напрямую содержать число с плавающей запятой.

Также обратите внимание, что, поскольку это находится в методе Start(), он будет прочитан только один раз при запуске, а затем больше никогда не будет обновляться.

Скорее всего, вы хотите сделать что-то вроде этого...

// At the top of the class, next to player
// No need to be public as you're setting and using it purely in code in this class
PlayerHealth playerHealth;

В вашем методе запуска вы получаете ссылку на сценарий здоровья игрока (но не текущее значение здоровья)...

playerHealth = GameObject.Find("Player").GetComponent<PlayerHealth>();

Затем из вашего метода обновления вы можете использовать playerHealth.Health, чтобы получить текущее значение здоровья.

Я пробовал это, теперь я получаю эту ошибку: «Не удается преобразовать группу методов« GetComponent »в тип« PlayerHealth », не являющийся делегатом. Вы намеревались вызвать метод?»

UltraAce 30.03.2023 13:06

Извините, опечатка с моей стороны ... Вам не хватает () в конце последнего фрагмента выше, я отредактирую ответ

Basic 30.03.2023 13:56

да, это помогло, большое спасибо

UltraAce 31.03.2023 09:31

Другие вопросы по теме