Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的GUI健康栏从两个方向而不是仅从一个方向排水?_C#_User Interface_Unity3d_Direction - Fatal编程技术网

C# 为什么我的GUI健康栏从两个方向而不是仅从一个方向排水?

C# 为什么我的GUI健康栏从两个方向而不是仅从一个方向排水?,c#,user-interface,unity3d,direction,C#,User Interface,Unity3d,Direction,我想这是因为我没有通过代码告诉它我希望它从哪个方向流出,但我认为这对unity来说已经很明显了,因为我在层次结构中的GUI图像类型上的设置是填充的,填充原点设置为左。不管怎样,我假设我的代码中有某种东西在告诉它从两个方面流失,也许??我的生活栅栏两边都在排水,但我只希望它从左边排水。有人有什么解决办法吗 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.

我想这是因为我没有通过代码告诉它我希望它从哪个方向流出,但我认为这对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来更改健康栏的大小,而希望更改图像组件的大小。为此,您需要将仪表对象(HungeMeter等)的类型更改为Image类型。

将健康栏绘制到屏幕上的代码在哪里?它是unity中的gui。顶部的RecTransform是我将健康栏放入RecTransformname的地方。哦,这就是原因吗???但是如果我这样做,“hungerMeter.sizeDelta=new Vector2(curHungerMeter,hungerMeter.sizeDelta.y);”与其他米一起不起作用,因为sizeDelta不适用于图像。您需要更改图像值的填充量,如文档中所述。另外,因为填充量的范围是0到1,所以您需要稍微更改逻辑。好的。你的反馈给了我足够的帮助,让我把事情弄清楚了。谢谢别担心!很高兴它起到了作用。另外,看看您编辑的代码,为什么不编写if(hungemeter!=null)hungemeter.fillAmount-=1.0f/drainTime*Time.deltaTime;?它将为您节省一些空间并使代码更具可读性,除非您真的希望在图像设置为null时返回方法。尽管我认为如果你在Inspector中设置字段,它永远不应该为空!