为什么我的 GUI 健康条从两个方向而不是从一个方向流出?
why is my GUI health bar draining from both directions instead of from only 1 direction?
我想这是因为我没有通过代码告诉它我希望它从哪个方向排出,但我认为这对 unity 来说已经很明显了,因为这是我在层次结构中的 GUI 图像类型上的设置已填充并且填充原点设置为左侧。无论如何,我假设我的代码中的某些内容可能会告诉它从两侧排出?我的生命条从两侧流出,但我只希望它从左侧流出。有人有解决办法吗?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class meterDrain : MonoBehaviour {
public float maxHungerMeter = 100f;
public float curHungerMeter;
public RectTransform hungerMeter;
public float maxThirstMeter = 100f;
public float curThirstMeter;
public RectTransform thirstMeter;
public float maxEnergyMeter = 100f;
public float curEnergyMeter;
public RectTransform EnergyMeter;
public float maxBowelsMeter = 100f;
public float curBowelsMeter;
public RectTransform bowelsMeter;
public float maxMoraleMeter = 100f;
public float curMoraleMeter;
public RectTransform moraleMeter;
void Start ()
{
curHungerMeter = maxHungerMeter;
curThirstMeter = maxThirstMeter;
curEnergyMeter = maxEnergyMeter;
curBowelsMeter = maxBowelsMeter;
curMoraleMeter = maxMoraleMeter;
}
// Update is called once per frame
void Update ()
{
TakeDamage ();
}
void TakeDamage(float amount = 10f){ //as of now the meters are being drained towards the middle from both sides. need to fix that
{
curHungerMeter -= amount * Time.deltaTime;
curThirstMeter -= amount * Time.deltaTime;
curEnergyMeter -= amount * Time.deltaTime;
curBowelsMeter -= amount * Time.deltaTime;
curMoraleMeter -= amount * Time.deltaTime;
}
if (hungerMeter == null) //for some reason, this is being applied all meters besides hunger, even though i didn't tell it to. *shrugs* works for me.
return;
hungerMeter.sizeDelta = new Vector2 (curHungerMeter, hungerMeter.sizeDelta.y);
thirstMeter.sizeDelta = new Vector2 (curHungerMeter, thirstMeter.sizeDelta.y);
EnergyMeter.sizeDelta = new Vector2 (curHungerMeter, EnergyMeter.sizeDelta.y);
bowelsMeter.sizeDelta = new Vector2 (curHungerMeter, bowelsMeter.sizeDelta.y);
moraleMeter.sizeDelta = new Vector2 (curHungerMeter, moraleMeter.sizeDelta.y);
}
}
//The edited script that now works...
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class meterDrain : MonoBehaviour {
private float drainTime = 10f;
private float maxHungerMeter = 100f;
public float curHungerMeter;
public Image hungerMeter;
private float maxThirstMeter = 100f;
public float curThirstMeter;
public Image thirstMeter;
private float maxEnergyMeter = 100f;
public float curEnergyMeter;
public Image energyMeter;
private float maxBowelsMeter = 100f;
public float curBowelsMeter;
public Image bowelsMeter;
private float maxMoraleMeter = 100f;
public float curMoraleMeter;
public Image moraleMeter;
void Start ()
{
curHungerMeter = maxHungerMeter;
curThirstMeter = maxThirstMeter;
curEnergyMeter = maxEnergyMeter;
curBowelsMeter = maxBowelsMeter;
curMoraleMeter = maxMoraleMeter;
}
// Update is called once per frame
void Update ()
{
TakeDamage ();
}
void TakeDamage(float amount = 10f){
{
curHungerMeter -= amount * Time.deltaTime;
curThirstMeter -= amount * Time.deltaTime;
curEnergyMeter -= amount * Time.deltaTime;
curBowelsMeter -= amount * Time.deltaTime;
curMoraleMeter -= amount * Time.deltaTime;
}
if (hungerMeter == null) {
return;
}
else
{
hungerMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (thirstMeter == null) {
return;
}
else
{
thirstMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (energyMeter == null){
return;
}
else
{
energyMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (bowelsMeter == null){
return;
}
else
{
bowelsMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (moraleMeter == null){
return;
}
else
{
moraleMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
}
}
您正在通过设置其 RectTransform 来更改健康栏的大小,而不是您想要更改图像组件的 Fill Amount。为此,您需要将仪表对象(hungerMeter 等)的类型更改为 Image。
我想这是因为我没有通过代码告诉它我希望它从哪个方向排出,但我认为这对 unity 来说已经很明显了,因为这是我在层次结构中的 GUI 图像类型上的设置已填充并且填充原点设置为左侧。无论如何,我假设我的代码中的某些内容可能会告诉它从两侧排出?我的生命条从两侧流出,但我只希望它从左侧流出。有人有解决办法吗?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class meterDrain : MonoBehaviour {
public float maxHungerMeter = 100f;
public float curHungerMeter;
public RectTransform hungerMeter;
public float maxThirstMeter = 100f;
public float curThirstMeter;
public RectTransform thirstMeter;
public float maxEnergyMeter = 100f;
public float curEnergyMeter;
public RectTransform EnergyMeter;
public float maxBowelsMeter = 100f;
public float curBowelsMeter;
public RectTransform bowelsMeter;
public float maxMoraleMeter = 100f;
public float curMoraleMeter;
public RectTransform moraleMeter;
void Start ()
{
curHungerMeter = maxHungerMeter;
curThirstMeter = maxThirstMeter;
curEnergyMeter = maxEnergyMeter;
curBowelsMeter = maxBowelsMeter;
curMoraleMeter = maxMoraleMeter;
}
// Update is called once per frame
void Update ()
{
TakeDamage ();
}
void TakeDamage(float amount = 10f){ //as of now the meters are being drained towards the middle from both sides. need to fix that
{
curHungerMeter -= amount * Time.deltaTime;
curThirstMeter -= amount * Time.deltaTime;
curEnergyMeter -= amount * Time.deltaTime;
curBowelsMeter -= amount * Time.deltaTime;
curMoraleMeter -= amount * Time.deltaTime;
}
if (hungerMeter == null) //for some reason, this is being applied all meters besides hunger, even though i didn't tell it to. *shrugs* works for me.
return;
hungerMeter.sizeDelta = new Vector2 (curHungerMeter, hungerMeter.sizeDelta.y);
thirstMeter.sizeDelta = new Vector2 (curHungerMeter, thirstMeter.sizeDelta.y);
EnergyMeter.sizeDelta = new Vector2 (curHungerMeter, EnergyMeter.sizeDelta.y);
bowelsMeter.sizeDelta = new Vector2 (curHungerMeter, bowelsMeter.sizeDelta.y);
moraleMeter.sizeDelta = new Vector2 (curHungerMeter, moraleMeter.sizeDelta.y);
}
}
//The edited script that now works...
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class meterDrain : MonoBehaviour {
private float drainTime = 10f;
private float maxHungerMeter = 100f;
public float curHungerMeter;
public Image hungerMeter;
private float maxThirstMeter = 100f;
public float curThirstMeter;
public Image thirstMeter;
private float maxEnergyMeter = 100f;
public float curEnergyMeter;
public Image energyMeter;
private float maxBowelsMeter = 100f;
public float curBowelsMeter;
public Image bowelsMeter;
private float maxMoraleMeter = 100f;
public float curMoraleMeter;
public Image moraleMeter;
void Start ()
{
curHungerMeter = maxHungerMeter;
curThirstMeter = maxThirstMeter;
curEnergyMeter = maxEnergyMeter;
curBowelsMeter = maxBowelsMeter;
curMoraleMeter = maxMoraleMeter;
}
// Update is called once per frame
void Update ()
{
TakeDamage ();
}
void TakeDamage(float amount = 10f){
{
curHungerMeter -= amount * Time.deltaTime;
curThirstMeter -= amount * Time.deltaTime;
curEnergyMeter -= amount * Time.deltaTime;
curBowelsMeter -= amount * Time.deltaTime;
curMoraleMeter -= amount * Time.deltaTime;
}
if (hungerMeter == null) {
return;
}
else
{
hungerMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (thirstMeter == null) {
return;
}
else
{
thirstMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (energyMeter == null){
return;
}
else
{
energyMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (bowelsMeter == null){
return;
}
else
{
bowelsMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
if (moraleMeter == null){
return;
}
else
{
moraleMeter.fillAmount -= 1.0f / drainTime * Time.deltaTime;
}
}
}
您正在通过设置其 RectTransform 来更改健康栏的大小,而不是您想要更改图像组件的 Fill Amount。为此,您需要将仪表对象(hungerMeter 等)的类型更改为 Image。