Я пытаюсь получить переменную с плавающей запятой из скрипта 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;
Однако он просто выдал другое сообщение об ошибке.
в скрипте «LightLevel» мне нужна переменная здоровья из скрипта «playerHealth» в виде числа с плавающей запятой, поэтому я могу изменить интенсивность света на это значение
Ошибка говорит вам о том, что у вас есть 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 », не являющийся делегатом. Вы намеревались вызвать метод?»
Извините, опечатка с моей стороны ... Вам не хватает ()
в конце последнего фрагмента выше, я отредактирую ответ
да, это помогло, большое спасибо
Это зависит от того, что вы хотите получить в результате. Ваша ошибка определенно говорит вам о том, что вы пытаетесь присвоить значение с плавающей запятой
Health
для GameObjectplayer
.