Как получить доступ к цвету материала дочернего объекта в функции collisionEnter - PullRequest
0 голосов
/ 07 июня 2019

возникли проблемы с моей игрой с единством.

У меня есть объект игрока, и у меня есть родительский объект с 8 дочерними объектами.

Я рандомизировал цветной материал дочерних объектов.а также цвет материала игрока.

я хочу определить, имеет ли цвет материала моего игрока == цвет материала дочернего объекта внутри функции collisionEnter.

я пробовал много, но это не сработало
вот код Спасибо заранее ребята

// I access the child object in SetRandomColor.cs 
void Start()
    {
        foreach (Transform child in parentCircle.transform)
        {
            int i = Random.Range(0, 8);
            if (child.gameObject.name == "Bar")
            {
                jumlahBar++; // kita sudah tau jumlah Bar ada berapa
                Debug.Log(jumlahBar);
                rendCircle = new Renderer[jumlahBar];
                rendCircle = gameObject.GetComponentsInChildren<Renderer>();
                Debug.Log("this is the: " + rendCircle[i].material.color);
            }
        }
    }




// then i tried to access the color of the child objects in my Player.cs 
// here the code, i tried this, but turn error 

  void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.GetComponentInChildren<Color> == player.gameObject.GetComponent<Color>)
        {
            Debug.Log("saya warna sama");
        }
    }

// Error '==' can be used in method group`enter code here`

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Color не является компонентом, поэтому вы должны получить компонент Renderer и посмотреть цвет его материала.Кроме того, вы забыли () в конце вызова метода GetComponentInChildren<...>().

Кроме того, преобразуйте цвета в Vector4, чтобы он сравнивал значения компонентов цвета.

Как предположил Эвертс, вы захотите дать каждому дочернему объекту коллайдер, если вы хотите проверить цвет именно того ребенка, с которым вы столкнулись.Так что просто используйте GetComponent, а не GetComponentInChildren.

Кроме того, вы должны вызывать GetComponent как можно меньше раз и помнить результат, где это возможно, потому что это дорогостоящая операция:

private Renderer playerRenderer;

void Start() 
{
    playerRenderer = player.GetComponent<Renderer>();
}

void OnCollisionEnter(Collision collision)
{
    Renderer collidedRenderer = collision.gameObject.GetComponent<Renderer>();

    if (collidedRenderer != null && 
            (Vector4)collidedRenderer.material.color ==
            (Vector4)playerRenderer.material.color
            )
    {
        Debug.Log("saya warna sama");
    }
}

Ваше пояснение выше означает, что вам не нужно этого делать, но я собираюсь оставить это здесь, потому что это может быть полезно для других людей ...

Если ваши цвета определены случайным образом так, что вам следует ждать только «достаточно близкого» цвета, сравните квадратное расстояние с «достаточно близким» расстоянием.

private Renderer playerRenderer;
private float closeColorSquareDistance = 0.01f;

void Start() 
{
    playerRenderer = player.GetComponent<Renderer>();
}

void OnCollisionEnter(Collision collision)
{
    Renderer collidedRenderer = collision.gameObject.GetComponent<Renderer>();

    if (collidedRenderer != null && 
            (   (Vector4)collidedRenderer.material.color
              - (Vector4)playerRenderer.material.color
            ).sqrMagnitude < closeColorSquareDistance
            )
    {
        Debug.Log("saya warna sama");
    }
}

Вам нужно будет найтизначение closeColorSquareDistance, которое делает сравнение для вас.Уменьшите closeColorSquareDistance, чтобы сделать сравнение более строгим, и увеличьте его, чтобы сделать сравнение более мягким.

0 голосов
/ 10 июня 2019
Color myColor = GetComponent<Renderer>().material.color;
Color barColor = collision.gameObject.GetComponent<Renderer>().material.color;

        if (myColor.IsEqualTo(barColor))
        {
            Debug.Log("saya warna sama");

            score = score + 1;
            if (PlayerPrefs.GetFloat("Best") < score)
                PlayerPrefs.SetFloat("Best", score);

            textscore.text = "" + score.ToString();
        }

==================================================================

The Extension class and method:


public static bool IsEqualTo(this Color me, Color other)
    {
        return me.r == other.r && me.g == other.g && me.b == other.b && me.a == other.a;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...