Не могу щелкнуть мышью в нужном месте на моей карте - PullRequest
0 голосов
/ 26 марта 2019

Я решил разработать игру гомоку, принцип которой очень прост: вы должны поместить круг или крест на карту плитки, и цель состоит в том, чтобы выровнять 5 предметов. Для этого я предпочитаю использовать единство в 2d и использую префаб с изображением плитки для создания своей карты. Проблема, с которой я столкнулся, заключается в том, что в моем скрипте GameManager, когда я передаю свою позицию щелчка мышью, позиция щелчка не совпадает с плиткой моей доски, которую я сгенерировал, поэтому я не могу поместить элемент на свою карту.

BoardGenerator.cs

public float startX;
public float startY;

public Transform tiles;

public int BOARD_SIZE = 19;

void Start()
{
    CreateBoard();
}

void Update()
{

}

void CreateBoard()
{
    float tileX = tiles.GetComponent<SpriteRenderer>().bounds.size.x;
    float tileY = tiles.GetComponent<SpriteRenderer>().bounds.size.y;
    float yCor = Camera.main.ScreenToWorldPoint(new Vector3(0, startY, 0f)).y;
    int count = 0;
    for (int i = 0; i < BOARD_SIZE; i++)
    {
        float xCor = Camera.main.ScreenToWorldPoint(new Vector3(startX, 0, 0f)).x;
        for (int j = 0; j < BOARD_SIZE; j++)
        {
            Vector3 tilesPos = new Vector3(xCor, yCor, 0f);
            Transform tile = Instantiate(tiles, tilesPos, Quaternion.identity);
            tile.gameObject.name = "Tile" + count;
            count++;
            xCor += tileX;
        }
        yCor -= tileY;
    }
}

GameManager.cs

public int firstPlayer;

private PlayerTurn playerTurn;

public Sprite xSprite;

public Sprite oSprite;

public enum PlayerTurn
{
    PLAYER1,
    PLAYER2,
    BOT
}

void Start()
{
    if (firstPlayer == 1)
        playerTurn = PlayerTurn.PLAYER1;
    else
        playerTurn = PlayerTurn.PLAYER2;
}

void Update()
{
    Play();
}

void Play()
{
    if (Input.GetMouseButtonDown(0))
    {
        float xCor = Camera.main.ScreenToWorldPoint(Input.mousePosition).x;
        float yCor = Camera.main.ScreenToWorldPoint(Input.mousePosition).y;
        Vector2 origin = new Vector2(xCor, yCor);
        RaycastHit2D hit = Physics2D.Raycast(origin, Vector2.zero, 0);
        Debug.Log("mouse = " + origin);
        Debug.Log("first tile = " + (Vector2)GameObject.Find("Tile0").transform.position);
        if (hit.collider != null && hit.transform.gameObject.tag.Equals("Tile"))
        {
            Debug.Log("hit");
            if (this.playerTurn == PlayerTurn.PLAYER1)
            {
                hit.transform.gameObject.GetComponent<SpriteRenderer>().sprite = xSprite;
                hit.transform.tag = "crossTile";
                playerTurn = PlayerTurn.PLAYER2;
            }
            else if (this.playerTurn == PlayerTurn.PLAYER2)
            {
                hit.transform.gameObject.GetComponent<SpriteRenderer>().sprite = oSprite;
                hit.transform.tag = "roundTile";
                playerTurn = PlayerTurn.PLAYER1;
            }
        }
    }
}

1 Ответ

0 голосов
/ 28 марта 2019

Вы можете воспользоваться другой перегрузкой для Raycast, чтобы возвратить попадание объекта, например:

Ray ray = camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics2D.Raycast(ray, out hit, rayDist)){

    GameObject obj = hit.transform.gameObject;

    // Do something with obj

}

В приведенном выше примере obj будет GameObject, который был пораженRaycast, так что вы можете получить его позицию, ссылаясь на:

obj.transform.position

Причина:

GameObject obj = hit.transform.gameObject;

состоит в том, что hit.gameObject вернет родительский объект с Rigidbodyесли есть.Это может привести к путанице в процессе работы с более сложными объектными структурами, поэтому рекомендуется использовать метод hit.transform.gameObject, который всегда будет возвращать GameObject, к которому прикреплен коллайдер, к которому подключен удар Raycast.

...