Измените цвет GameObject из-за расстояния - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь изменить значение красного цвета объекта dut на расстояние между ним и камерой с помощью этого кода:

using UnityEngine;
using UnityEngine.UI;     

public class DistanceToCheckpoint : MonoBehaviour {

    // Reference to checkpoint position
    [SerializeField]
    private Transform checkpoint;

    // Reference to UI text that shows the distance value
    [SerializeField]
    private Text distanceText;

    // Calculated distance value
    private float distance;

    // Update is called once per frame
    private void Update()
    {
        // Calculate distance value between character and checkpoint
        distance = (checkpoint.transform.position - transform.position).magnitude;

        // Display distance value via UI text
        // distance.ToString("F1") shows value with 1 digit after period
        // so 12.234 will be shown as 12.2 for example
        // distance.ToString("F2") will show 12.23 in this case
        distanceText.text = "Distance: " + distance.ToString("F1") + " meters";
    }

}

И затем я помещаю это в Update ():

checkpoint.GetComponent<Renderer>().material.color = new Color(1, (255 - distance.ToString("F1")), 0, 0);

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

У меня просто получилось:

using UnityEngine;
using UnityEngine.UI;     

public class DistanceToCheckpoint : MonoBehaviour {

    // Reference to checkpoint position
    [SerializeField]
    private Transform checkpoint;

    // Calculated distance value
    private float distance;

    // Update is called once per frame
    private void Update()
    {
        // Calculate distance value between character and checkpoint
        distance = (checkpoint.transform.position - transform.position).magnitude;

        checkpoint.GetComponent<Renderer>().material.color = new Color(-(100 - distance), 0, 0);
    }

}

Теперь я хочу применить его к различным элементам. Как вы думаете, есть ли способ сделать foreach?

0 голосов
/ 11 июня 2018

Вам нужно будет определить расстояние, на котором объект будет полностью красным.Затем вы можете изменить значение на основе коэффициента этого расстояния.

Например, если вы хотите, чтобы оно было красным на расстоянии 50 и дальше, вы бы сделали ...

checkpoint.GetComponent<Renderer>().material.color = new Color(distance/50f, 0, 0);
0 голосов
/ 11 июня 2018

Я не включил все, что вы сделали, только части, относящиеся к ответу.И я прокомментировал это в надежде позволить вам следовать рассуждениям.

public class DistanceToCheckpoint : MonoBehaviour
{
    // Reference to UI text that shows the distance value
    [SerializeField]
    private Text distanceText;

    // Reference to checkpoint position
    [SerializeField]
    private Transform checkpoint;
    private Material checkpointMaterial;

    [Tooltip ( "This is the color your object starts with." )]
    public Color StartColor;
    [Tooltip ( "This is the distance your object is the Start Color." )]
    public float ColorDistanceFar;
    [Tooltip ( "This is the distance your object becomes full black." )]
    public float ColorDistanceNear;
    private float colourDistanceRange;

    // Calculated distance value
    private float distance;

    private void Start ( )
    {
        colourDistanceRange = ColorDistanceFar - ColorDistanceNear;
        checkpointMaterial = checkpoint.GetComponent<Renderer> ( ).material;
    }

    private void Update ( )
    {
        // Calculate distance value between character and checkpoint
        distance = ( checkpoint.transform.position - transform.position ).magnitude;
        distanceText.text = $"Distance: {distance.ToString ( "F1" )} meters";

        // Start with full color amount.
        float colourAmount = 1;
        // Check to see if the distance is closer than the ColorDistanceNear distance. In which case the colour should be black.
        if ( distance <= ColorDistanceNear ) colourAmount = 0;
        // Else, check to see if the distance is closer than the ColorDistanceFar distance. We need to "normalize" this value.
        else if ( distance < ColorDistanceFar ) colourAmount = ( distance - ColorDistanceNear ) / colourDistanceRange;

        // Now we "multiply" the colour with the colourAmount to get something between the full colour and black.
        checkpointMaterial.color = StartColor * colourAmount;
    }
}
0 голосов
/ 11 июня 2018

Четвертый параметр Color представляет собой альфа-значение (прозрачность)

  • 0 означает невидимое
  • 1 полностью видимое

Авводимые вами значения должны быть значениями с плавающей запятой в диапазоне от 0 до 1.

float startDistance = 100f;
float blackAtDistance = 5f;

distance -= blackAtDistance;
percentage = distance / maxDistance;
percentage = Mathf.Clamp(percentage, 0, 1);
checkpoint.GetComponent<Renderer>().material.color = new Color(percentage, 0, 0, 1);

Я не проверял его, но он должен работать.

...