Нарисуйте сетку, используя материал разных цветов - PullRequest
0 голосов
/ 23 сентября 2018

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

public class GridDebugger : MonoBehaviour {

    [SerializeField] private float alpha;

    private Mesh mesh;
    private Material mat;

    void Start() {
        mat = new Material(Shader.Find("Sprites/Default"));
        mesh = new Mesh();
        mesh.vertices = new Vector3[] { new Vector3(.5f, .5f, 0), new Vector3(.5f, -.5f), new Vector3(-.5f, -.5f), new Vector3(-.5f, .5f) };
        mesh.triangles = new int[] { 0, 1, 2, 2, 3, 0 };
    }

    public void Debug(Vector3 position, Color color) {
        color.a = alpha;
        mat.color = color;
        Graphics.DrawMesh(mesh, position, Quaternion.identity, mat, 0);
    }
}

В настоящее время у класса есть два пользователя:

[RequireComponent(typeof(GridDebugger))]
public class CollisionSystem : GridSystem {
    private List<Node>[,] grid;
    private GridDebugger debugger;

    void Awake() {
        debugger = GetComponent<GridDebugger>();
    }

    //Logic....

    void Update() {
        if (grid != null) {
            for (int x = 0; x < grid.GetLength(0); x++) {
                for (int y = 0; y < grid.GetLength(1); y++) {
                    if (grid[x, y] != null) {
                        for (int i = 0; i < grid[x, y].Count; i++) {
                            if (grid[x,y][i].Parent.Debug) {
                                Vector3 worldPos = GridToWorldPos(new Vector2Int(x, y), grid.GetLength(0), grid.GetLength(1));
                                worldPos.z = -0.0001f;
                                debugger.Debug(worldPos, Color.Red);
                            }
                        }
                    }
                }
            }
        }
    }     
}

И

public class GridMeleeWeapon : MonoBehaviour {
    private GridDebugger debugger;

    void Awake() {
        debugger = FindObjectOfType<GridDebugger>();
    }    

    public void Aim(Vector2 dir) {
        Vector3 position = transform.position + dir;
        debugger.Debug(position, Color.blue);                 
    }
}

В CollisionSystem Я зацикливаю каждый коллайдер и рисую красный квадрат в каждой позиции.В GridMeleeWeapon я просто рисую синий квадрат, к которому стремится игрок.

Проблема в том, что каждый квадрат рисуется с цветом, используемым в CollisionSystem, то есть красным.При рисовании синих квадратов в GridMeleeWeapon они становятся красными.Если я удаляю debugger.Debug(worldPos, Color.Red) в CollisionSystem, квадраты, которые я рисую из GridMeleeWeapon, отображаются синим цветом.

С текущим кодом я не могу рисовать сетки разных цветов.Я думаю, что происходит, что цвет, указанный первым абонентом, используется для последовательных вызовов, даже если цвет материала изменился, но почему я понятия не имею.

Как правильно установить цвет?

1 Ответ

0 голосов
/ 23 сентября 2018

Материал в Unity 3D является ссылочным типом.

Ваш код в GridMeleeWeapon и CollisionSystem использует один и тот же экземпляр GridDebugger и материал.Что происходит, так как вы изменяете цвет материала OnUpdate(), он мгновенно меняет цвет с синего на красный (каждый кадр) для каждого объекта, использующего этот материал.

Вместо передачи цвета в ваш метод debugger().Debug(), передайте материал другого цвета.Например, создайте материал с красным цветом и другой материал с синим цветом.Используйте эти материалы, чтобы установить цвет.

...