【问题标题】:How can I add a scriptable tile at runtime to a Unity Tilemap?如何在运行时将可编写脚本的图块添加到 Unity Tilemap?
【发布时间】:2018-06-04 18:45:21
【问题描述】:

我正在尝试在运行时将我的一个可编写脚本的图块添加到我的 Unity Tilemap。我可以在编辑器中绘制磁贴,一切看起来都很好,但我想在运行时添加它。

我尝试实例化 ScriptableObject 资产本身,但它没有生成的图块资产在编辑器中所需的正确精灵。另外,我不认为我应该为每个图块实例化 ScriptableObject 资产,因为一个资产是要为地图上的所有相同图块共享的。

Tilemap API 提供了一种添加图块的方法,但没有说明或示例说明如何创建图块。

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    这有点出乎我的意料,但我昨天在搞类似的事情,点击时实例化一个图块。

    Vector3Int tilePos = map.WorldToCell(mousePos);
    
        YourTileClass tileInstance = ScriptableObject.CreateInstance<YourTileClass>();
    
        Texture2D tex = Resources.Load<Texture2D>("tileTexture") as Texture2D;
    
        Sprite sprite = new Sprite();
    
        sprite = Sprite.Create(tex, new Rect(0, 0, 400, 400), new Vector2(0.5f, 0.5f));
    
        Tile tile = Resources.Load<Tile>("tileInstance") as Tile;
    
        tileInstance .sprite = sprite;
    
        yourTileMap.SetTile(tilePos , tile);
    

    如果这是最好的方法,我不是 100%,但它对我有用。如果这不起作用,请告诉我,我会仔细检查实际文件。

    【讨论】:

      【解决方案2】:

      抱歉,我无法发表评论,但不知道到目前为止您已经尝试过什么,您是否尝试过在检查器中分配规则拼贴,然后在需要时在运行时使用 SetTile 分配它?从它的声音来看,这应该可以实现您想要做的事情

      public Tilemap tilemap;
      public MyRuleTile myRuleTile;
      

      tilemap.SetTile(coordinate, myRuleTile);
      

      【讨论】:

        【解决方案3】:

        假设您的 ScriptableObject 继承自 TileBase 对象,您可以执行以下操作:

         public Tilemap tilemap; 
         public TileBase tileToDraw; //Object to draw at runtime
        
         //Get tilemap position from the worldposition
         Vector3Int tilemapReferencePosition = tilemap.WorldToCell(reference.transform.position);//this can be the position of another gameObject e.g your Player or MousePosition
        
        roadTileMap.SetTile(tilemapReferencePosition, tileToDraw);
        

        我最近在火焰之纹章风格的 RPG 中使用了类似的东西,我想在施法之前绘制一个法术可以施法的所有潜在方向,我最终得到了以下函数

        public void DrawPreAttack(GameObject reference, Spell spell) {
            Vector3Int gridReferencePos = preAttackTileMap.WorldToCell(reference.transform.position);
            foreach (Vector2 direction in spell.validDirections) {
                for (int i = 0; i <= spell.maxDistance; i++) {
                    preAttackTileMap.SetTile(new Vector3Int(gridReferencePos.x + (i * (int)direction.x) , gridReferencePos.y + (i * (int)direction.y) , 0), preAttackTile);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-17
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          • 2011-12-04
          相关资源
          最近更新 更多