2018年の目標
相変わらず進捗はダメダメです。
が、光陰矢の如し。
処女作Astral Throneに取掛かって、気付けば10年の歳月が流れました。
今年は戦場でのNPCの振舞いを中心に、AIについての学習と実装を本格的に行おうと思います。
目安として、10月末までに何か動くものを作り上げられればいいかな、と。
が、光陰矢の如し。
処女作Astral Throneに取掛かって、気付けば10年の歳月が流れました。
今年は戦場でのNPCの振舞いを中心に、AIについての学習と実装を本格的に行おうと思います。
目安として、10月末までに何か動くものを作り上げられればいいかな、と。
2016年は……
進捗ダメでした!!!!
1日24時間のうち、7時間を睡眠に費やし、10.5時間を換金しても……6.5時間あるじゃないか!
というのは極論ですが。
2020年までに完成させるという目標も、累卵の危うきにあります。
書かねば! 描かねば!!
1日24時間のうち、7時間を睡眠に費やし、10.5時間を換金しても……6.5時間あるじゃないか!
というのは極論ですが。
2020年までに完成させるという目標も、累卵の危うきにあります。
書かねば! 描かねば!!
Unityでマップを自動生成する(その1)
外部に定義したマップファイルから、全体マップと戦域マップを自動生成する機能(一部)を実装しました。
外国産戦略シミュレーションゲームでは、画像ファイルから世界地図を自動生成するというような機能はよく見られます(パラドゲーなど)。
しかし、今作っているのは宇宙空間を舞台にしたものなので、本来、陸地や海といった行動できる範囲とできない範囲が分かれているということは考えにくいのが実態です。それでもなぜこの機能を実装したかというと、ひとえに「回廊の戦い」をやりたいから。これに尽きます。もっと言うと、ユーザが魔改造して勝手な地形を自由に生成して遊べるような自由度を持たせたかったということもありますが。
実際にどんな処理をするかというと、大体次のような手順になります。
最後に実行結果です。
戦域マップ用のベース小領域
ちなみにこれ、黒以外に色分けの意味はありません。
自動生成された戦域マップ

正しく実装されていることがわかります。まぁ、元のピクセル数が低い(11*11px)だけに、お世辞にも味のある戦域マップとはいえないですね。
オマケ
やっぱりこれくらいの大きさの、しかもこういう地形だと胸が熱いですね!! 単縦陣一航過で敵泊地に殴り込みをかけたくなります。
次回は、宇宙空間との合成と、航行不能領域の具体的なビジュアライゼーションを実装する予定です。早めにできるといいが……。
外国産戦略シミュレーションゲームでは、画像ファイルから世界地図を自動生成するというような機能はよく見られます(パラドゲーなど)。
しかし、今作っているのは宇宙空間を舞台にしたものなので、本来、陸地や海といった行動できる範囲とできない範囲が分かれているということは考えにくいのが実態です。それでもなぜこの機能を実装したかというと、ひとえに「回廊の戦い」をやりたいから。これに尽きます。もっと言うと、ユーザが魔改造して勝手な地形を自由に生成して遊べるような自由度を持たせたかったということもありますが。
実際にどんな処理をするかというと、大体次のような手順になります。
- 全体マップから戦域に相当する小領域を抽出
- 航行不能領域の膨張処理
- 同エッジ抽出
- エッジを元に頂点情報を生成
- 拡大戦域マップの作成(線引きおよび内挿補完)
最後に実行結果です。
戦域マップ用のベース小領域

ちなみにこれ、黒以外に色分けの意味はありません。
自動生成された戦域マップ

正しく実装されていることがわかります。まぁ、元のピクセル数が低い(11*11px)だけに、お世辞にも味のある戦域マップとはいえないですね。
オマケ
やっぱりこれくらいの大きさの、しかもこういう地形だと胸が熱いですね!! 単縦陣一航過で敵泊地に殴り込みをかけたくなります。
次回は、宇宙空間との合成と、航行不能領域の具体的なビジュアライゼーションを実装する予定です。早めにできるといいが……。
Unityで外部画像ファイルからスプライトを生成する
首記のとおり、Unityで外部フォルダの画像からスプライトを生成する方法の備忘録です。
今作っているゲームの場合、ユーザが作成した定義ファイルや、キャラクタの画像を必要に応じてスクリプト側から自動生成・解析できるようにする必要があります。
というわけで、_DataフォルダやAssetフォルダの外に定義したフォルダから、PNGを読み込んでテクスチャを作成、作成したテクスチャを用いてスプライトを作成するコードを書きました。
以下、C#のソースコードとインスペクタです(もともと戦場を動的に生成するために作ったので、クラス名がDefine Theaterとなっています)。
1対1でピクセルを対応させるために、Sprites/Defaultシェーダを設定したオブジェクト(Pixel Perfect)を作成して取り付けています。Pixel Perfect内では、Pixel snapにチェックを入れているだけです。

今作っているゲームの場合、ユーザが作成した定義ファイルや、キャラクタの画像を必要に応じてスクリプト側から自動生成・解析できるようにする必要があります。
というわけで、_DataフォルダやAssetフォルダの外に定義したフォルダから、PNGを読み込んでテクスチャを作成、作成したテクスチャを用いてスプライトを作成するコードを書きました。
以下、C#のソースコードとインスペクタです(もともと戦場を動的に生成するために作ったので、クラス名がDefine Theaterとなっています)。
C#
using UnityEngine; using System.IO; public class DefineTheater : MonoBehaviour { private SpriteRenderer sr; void Start () { this.sr = this.gameObject.GetComponent<SpriteRenderer>(); Texture2D texture = ReadTexture (".\\Graphics\\Character\\atc054.png", 90, 110); Sprite createdSprite = Sprite.Create (texture, new Rect (0, 0, 90, 110), new Vector2 (0, 1), 1); this.sr.sprite = createdSprite; } private Texture2D ReadTexture(string path, int width, int height){ byte[] readBinary = ReadPngFile(path); Texture2D texture = new Texture2D(width, height); texture.LoadImage(readBinary); texture.filterMode = FilterMode.Point; return texture; } void Update () { } }実行結果
1対1でピクセルを対応させるために、Sprites/Defaultシェーダを設定したオブジェクト(Pixel Perfect)を作成して取り付けています。Pixel Perfect内では、Pixel snapにチェックを入れているだけです。



