Unity2D 사용자 정의 스크립터블 타일의 이해 및 사용(4개) - Tile 클래스를 기반으로 사용자 정의 타일 빌드 시작(아래)

이 글에서 사용된 유니티 버전은 Unity2018.4.36f1이며 스크립팅 언어는 C#입니다.

소개:

지난 글에서는 우리가 원했던 첫 번째 기능인 타일 이미지를 주변 상황에 따라 적합한 이미지로 변경하는 기능을 구현했습니다. 이 기사에서는 첫 번째보다 훨씬 구현하기 쉬운 두 번째 기능을 구현합니다.


텍스트:

우리의 두 번째 기능이 어떤 종류의 기능을 수행해야 하는지 아직도 기억하십니까? 이전 기사에서 설명했습니다.

악당 모양의 게임 오브젝트를 부착할 수 있으며 각 악당의 색상은 랜덤으로 획득됩니다.

그래서 이 글에서는 타일에 빌런을 붙이고자 하는데, 이 빌런은 게임오브젝트의 형태로 존재하며, 타일을 놓을 때마다 추가 빌런의 색상이 랜덤하게 생성되며, 우리가 할 필요가 없다. 수동으로 조정합니다.

좋아, 그게 일어나기 시작했어!

이 시리즈의 두 번째 기사에서 말한 것을 기억하십시오. Tile 클래스에는 gameobject 라는 멤버 변수가 있습니다 .

Inspector에 표시되는 멤버 변수의 이름은 아래와 같이 instancedGameObejct 입니다.

사실 코드에서는 게임오브젝트 라고도 하는데, 이 멤버 변수에 값을 할당하여 타일 인스턴스에 게임오브젝트를 마운트할 수 있습니다. 아래 애니메이션에서 볼 수 있듯이: 

우리 가 작성한 스크립트가 아니라 우리가 만든 타일 인스턴스 에 값을 할당하는 것을 잊지 마십시오. (무의미한 말)

그런 다음 브러시를 사용하여 타일을 그리면 타일 옆에 추가 게임 개체(이 문서에서는 악당)가 있음을 알 수 있습니다. 타일이 생성될 때마다 추가 악당 클론이 생성됩니다.

놀랍지 않나요? :)

사실 이 구현 과정에서 언급하지 않은 단계가 있습니다. MyTile의 부모 클래스인 Tile 클래스가 이미 우리를 위해 작성되었기 때문입니다. 이 단계는 GetTileData 메서드로 작성됩니다.

위 그림과 같이 이 단계는 멤버 변수 gameobject(실제 이름은 instancedGameObejct)를 tileData의 게임 오브젝트에 할당하는 것입니다. 즉, 이 게임 오브젝트를 Tilemap 시스템에 전달하여 어떤 게임이 타일은 개체를 마운트해야 합니다.

그런 다음 악당에게 임의의 색상을 부여하는 마지막 단계를 구현해 보겠습니다.

이 기능은 StartUp 메서드 에 있습니다 . 이 시리즈의 첫 번째 기사에서 이 메서드의 목적에 대해 이야기했습니다.

 이 방법을 사용하여 인스턴스화된 게임 개체에 값을 할당합니다.

이 방법의 큰 기능 중 하나는 타일에 장착된 게임 개체를 초기화하는 것이라고 설명합니다.

이 방법을 살펴보겠습니다.

StartUp(Vector3Int 위치, ITilemap 타일맵, GameObject go)

go 매개변수를 눈치채셨습니까? 이 go는 타일에 장착된 게임 개체를 나타냅니다!

그래서 우리는 메서드에서 계속 작업을 수행하면 됩니다.

StartUp 메서드 코드를 녹아웃합니다.

 그런 다음 해당 논리를 추가하십시오.

public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go)
    {
        go.transform.position += new Vector3(0, 0.5f, 0);
        go.GetComponent<SpriteRenderer>().color = new Color32((byte)Random.Range(1, 266), (byte)Random.Range(1, 266), (byte)Random.Range(1, 266), 255);
    }

악당의 좌표를 0.5만큼 위로 이동시킵니다. 그런 다음 색상을 임의의 색상과 동일하게 만듭니다.

여기에서 Color32를 이해하지 못한다면 직접 백과사전을 참조하십시오. 3개의 난수를 사용하여 RGB 값을 무작위화하여 a 값이 255가 되도록 합니다.

신중한 친구는 이 메서드의 반환 값이 bool 유형이므로 마지막에 bool 값이 반환되어야 한다는 사실을 발견했을 수도 있습니다. 그렇다면 bool 값을 반환하는 이유는 무엇이며 이 bool 값의 참 또는 거짓은 무엇에 영향을 줍니까? 정답은 모르겠습니다 유니티의 공식 문서에는 설명이 없어서 제가 직접 테스트를 해봤습니다 true/false 리턴 여부에 관계없이 StartUp 메소드가 정상적으로 호출되고 내부 로직이 원활하게 실행되며, 따라서 이 메서드의 반환 값은 우리의 편의를 위한 것이라고 추측할 수 밖에 없습니다.예를 들어 어떤 경우에는 true를 반환하고 어떤 경우에는 false를 반환한 다음 메서드의 반환 값을 기반으로 일부 논리를 구현합니다.

그런 다음 보기에 좋은 true를 반환해 보겠습니다.

 public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go)
    {
        Debug.Log("good");
        go.transform.position += new Vector3(0, 0.5f, 0);
        go.GetComponent<SpriteRenderer>().color = new Color32((byte)Random.Range(1, 266), (byte)Random.Range(1, 266), (byte)Random.Range(1, 266), 255);
        return true;
    }

자, 기능을 테스트해 봅시다.

 

문제 없습니다. 약간의 거리를 이동하고 무작위로 색상을 생성합니다. 하지만 조심스러운 친구들은 악당의 색이 타일을 그릴 때 무작위로 생성될 뿐만 아니라 브러시가 배치된 타일에 가까워지면 타일 위의 악당의 색이 변한다는 사실을 발견했을 것입니다. method 메소드를 호출하는 타이밍은 관련이 있으며이 메소드를 호출하는 타이밍을 잊어 버린 친구는 첫 번째 기사로 이동하여 검토 할 수 있습니다.

게임 시작 버튼을 클릭하면 게임의 첫 번째 프레임에서도 이 메서드가 호출되므로 색상도 변경되고 게임마다 다릅니다.

자, 그럼 우리의 모든 기능이 끝났습니다. 아래에 모든 소스 코드를 넣었고, 필요한 친구들은 스스로 복사할 수 있습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;


[CreateAssetMenu(menuName = "myTile")]
public class MyTile : Tile
{
    public Sprite[] Sprites;

    public override void RefreshTile(Vector3Int position, ITilemap tilemap)
    {
        base.RefreshTile(position, tilemap);
        tilemap.RefreshTile(position + new Vector3Int(1, 0, 0));
        tilemap.RefreshTile(position + new Vector3Int(-1, 0, 0));
        tilemap.RefreshTile(position + new Vector3Int(0, 1, 0));
        tilemap.RefreshTile(position + new Vector3Int(0, -1, 0));
    }

    public override void GetTileData(Vector3Int position, ITilemap tilemap, ref TileData tileData)
    {
        base.GetTileData(position, tilemap, ref tileData);
        int index = 0;
        index = getIndex(position, tilemap);
        tileData.sprite = Sprites[index];
    }

    public int getIndex(Vector3Int position, ITilemap tilemap)
    {
        string roadSituation = "";
        if (tilemap.GetTile(position + new Vector3Int(-1, 0, 0)) == this)
            roadSituation += "a";
        if (tilemap.GetTile(position + new Vector3Int(1, 0, 0)) == this)
            roadSituation += "b";
        if (tilemap.GetTile(position + new Vector3Int(0, 1, 0)) == this)
            roadSituation += "c";
        if (tilemap.GetTile(position + new Vector3Int(0, -1, 0)) == this)
            roadSituation += "d";

        switch (roadSituation)
        {
            case "a":
                return 1;
            case "b":
                return 1;
            case "c":
                return 0;
            case "d":
                return 0;
            case "ab":
                return 1;
            case "ac":
                return 2;
            case "ad":
                return 4;
            case "bc":
                return 3;
            case "bd":
                return 5;
            case "cd":
                return 0;
            case "abc":
                return 6;
            case "abd":
                return 7;
            case "acd":
                return 9;
            case "bcd":
                return 8;
            case "abcd":
                return 10;
        }
        return 0;
    }

    public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go)
    {
        go.transform.position += new Vector3(0, 0.5f, 0);
        go.GetComponent<SpriteRenderer>().color = new Color32((byte)Random.Range(1, 266), (byte)Random.Range(1, 266), (byte)Random.Range(1, 266), 255);
        return true;
    }
}

이 글이 도움이 되셨다면 좋아요 눌러주세요~

추천

출처blog.csdn.net/scombropidae/article/details/125970103