だらだら〜自由自在〜

インディーゲーム制作チーム GAME GABURI でプログラム担当してます

いいなーと思ったUnityPluginメモ

Hierarchy2 - https://www.assetstore.unity3d.com/#/content/14032
Build Report Tool - https://www.assetstore.unity3d.com/#/content/8162
DocuMaker - https://www.assetstore.unity3d.com/#/content/16257
Enhanced Edtor - https://www.assetstore.unity3d.com/#/content/135

2Dのタイルマップエディタを探しているわけなんですけど

Unity4.3でドラクエ6とか、FF6とかの街マップみたいなものを作りたくて、そのためのタイルマップエディタを探しているわけなんですけども、結論からいうとどうも微妙な気がする。
Unityの拡張を最初にあたったんですけども、2D Map Factoryなんかがいいのかなぁと思って買って試してみたんですけどね、慣れの問題というのはものを評価するときにちゃんと気にしてはいるんですけど、ちょっと意味分かんない。Layerがね、増やせないんですね(こわいなーこわいなー)
まぁそれで「もういい」って思って視点を変えてWindowsフリーソフトとかでMapEditorって無いかな?ッて思って探してみたんですね。Tiled Map Editorってのがありました。結構操作しやすい感じます。Eventエリアなんか設定したくなってくるんですが、それはObjectでRectをおいてObjectPropertyでEventIDやらを設定してやればいいのかな?まぁちょっと使えそうなんで検証したいんですが、肝心なのはUnity上での再生ですね。C#のパーザなんかがあれば超ありがとうなのですが。

あとこの方が自分と同じ思いからの同じ帰結でおもしろい。そうなんですよね、画面上下で奥行きのある見下ろし型マップの作成が楽にできそうなUnity拡張さがしてたんですが、どれも真横から見る感じの2Dアクションのマップばっかりつくってて(デモで)、なんだかなぁと思ってるところ。

PSM UISystem

昨日から悩んでいた、UISystemとGameEngine2Dを一緒に使うとクラッシュする件。進展があった。
GameEngine2Dはどうやら無関係、おもいっきり濡れ衣を着せていた、ごめんね。

いろいろ削って削って最小構成だろう、というものでもUISystem.Initializeでクラッシュしてしまう。
正確に言えば
・F5デバッグすると
・Launchしたゲームウィンドウが白画面のまま動作が停止して
・しばらくすると、「psm.exeは動作を停止しました」というダイアログが表示され
・TTYには下記ログが出力されている状態

app.info : memory : resource_heap_size=67108864, managed_heap_size=33554432

app.info : require feature : Touch

C# Assembly Loading [ C:\\Users\\Public\\Documents\\PSM\\sample\\UI\\DemoGameUI\\bin\\Debug\\GameUI-unsigned\\Application\\app.exe ]

Loaded assembly: C:\Program Files (x86)\SCE\PSM\mono\lib\psm\Sce.PlayStation.Core.dll
Loaded assembly: C:\\Users\\Public\\Documents\\PSM\\sample\\UI\\DemoGameUI\\bin\\Debug\\GameUI-unsigned\\Application\\app.exe
Loaded assembly: C:\Program Files (x86)\SCE\PSM\mono\lib\mono\2.1\System.dll
Loaded assembly: C:\\Users\\Public\\Documents\\PSM\\sample\\UI\\DemoGameUI\\bin\\Debug\\GameUI-unsigned\\Application\\Sce.PlayStation.HighLevel.UI.dll
Sony Computer Entertainment America LLC

OpenGL

OpenGL ES 2.0 Piglet(0.1.1)

OpenGL ES GLSL ES 2.0

Thread started:
Thread started:

で、もうわけわからんなー。もしかしてGraphicsAPIにグラボが対応してない?とおもって対応OpenGLバージョンをしらべてみたけど、OpenGL4.2まで対応している様子。
そういえばサンプルはコード見ただけで実行してないなとおもって、C:/Users/Public/Documents/PSM/sample/UI/DemoGameUIをデバッグ実行。
やっぱりクラッシュする…。

えー、それはさすがにおかしい。と思って普通に「実行(Ctrl+F5)」してみる…ちゃんと動いた。
もう寝よう

PSM

ゲーム作成中

https://github.com/nyakagawan/PSM-kabuto
PSMStudio割合不安定だな…。ビルド中にフリーズしたり、デバッグが満足にできなかったり(これは自分のやりかたが悪いのか???)
DocumentかどこかにVisualStudioに対応予定です。と書いてあったけど、頑張って対応して欲しいところ。

調査中

Sce.PlayStation.HighLevel.UIとSce.PlayStation.HighLevel.GameEngine2Dって、もちろん共存できるよね?
調査中

うーむ、何故かUISystem.Initializeでクラッシュする。そしてデバッガが一つも有益な情報を出さずにただただ起動しているだけなので、直接の原因も不明。というかPSMStudioのデバッガがあまりに役に立たないのだが、変数の中身は見れないし、ブレークポイント貼るとクラッシュするし。…さすがにクオリティとしてありえないレベルだから、自分の環境のせいなんだろうが

PlayStationMobile

PSMのパブリッシャーライセンスを2日前ぐらいに申請した。

いつ頃登録されるのかなぁ

PSMの開発環境がおもったより大分良さそう

C#が4.0らしいので、LINQとか使える。
MonoDevelopが結構良い。
この2つはUnityとくらべてかなーり良い。
でも、VisualStudioで開発できない?すくなくともDebugとかはできない。これは惜しい感じだけどMonoDevelopが頑張ってるのでまぁ別に…。なのか。
あとDocumentしっかりしてるしサンプルもたくさん

MonoDevelopのSolarizedColorScheme

https://github.com/oleyb/monodevelop-colors-solarized
…でもこれ、自分にはなんかちょっと暗すぎるな。

何かゲームを作ってみる。

https://github.com/nyakagawan/PSM-kabuto
SampleのActionGameDemoがひな形的に良さそうなので、それを下地に軽いゲームを作ってみる。
PC上でプレイできればOK(Vitaにパブリッシュできるようになれば…)
とりあえず、Mainからたどって、最低限動作+多分必要と判断できるコードをごっそりパクった。
実行すると、Demoのタイトル画面(背景とSEのみ)が表示される

cocos2dx 作業めも

りぽじとり:https://github.com/nyakagawan/MyGame

Debug用font描画

Debug表示用に簡単につかえるフォント描画が欲しかったので作成。
処理コスト的にもメモリ的にもTrueTypeFontよりBitmapフォントのほうが有利なので、そっちで作る。始めにcocos2d自体にDebugFontがないのか探してみたが見つからなかった。
FPS描画部分を見てみたり、Sampleを見てみたりいろいろしたが、結果的に自分でfntファイルとFont画像ファイルを用意することに。

フォント画像はこのサイトで作成した。非常に便利。
http://kvazars.com/littera/

あと参考にさせてもらったサイト。多謝
http://ktaobo.blogspot.jp/2013/09/cocos2dx-bmfont.html
http://sarudeki.jp/fernweh/fnt-fntfile/

上記フォント作成サイトで固定幅フォントで作ってみたが、どうも縦サイズがまちまちになっているような気がしてならない。横は固定幅になってるからまぁいいのかな・・・??
あと、FontSize28でつくったけど、デバッグ用にしては少しだけでかい気がする。256x256だし。つか、Bitmapフォントといいつつ画像はpngなわけだが、これはロード時にBitmapTextureを作成してるんだろうか。色数減らせるだろうか?

思ったこと

  • Soucetreeのcommit時にgithubのissueをcloseするようなメッセージの書き方とかないのかな?

  • いい加減、Resoucesからの相対パス指定がしたくなってきた。気になる。

coco2dx 3.0

作業めも

りぽじとり:https://github.com/nyakagawan/MyGame

Resourceファイルの相対パス指定

Resources/chara/majo.pngの画像ロードができない・・・。Resources/majo.pngならおk。パスの解決に失敗しているみたいだけど、いちいち全SubDirectoryをAddSearchPathしないと駄目とか??まさか。
謎だが、先に進む

plistでSpriteAnimation

cocos付属のSampleコードを参考に。
素材は[ぴぽや]さんのを使わせていただいた
http://piposozai.blog76.fc2.com
96x128のpng画像

こういう32x32ピクセルの魔女っこの歩くアニメーションを実装してみる。
http://blog-imgs-68-origin.fc2.com/p/i/p/piposozai/optpix_png2.png
テストなので一番上の列の左から順に再生するだけ。

SpriteAnimationのSpriteSheetはplistファイルで指定する様子。TexturePackerとかの結合ツールでバラバラのスプライトをくっつけて一緒にplistを吐き出して利用するのが真面目な使い方みたいだが、今回は結合済みのSpriteを使うので、plistを手書きする。
plistはcocos2dx TestCppのなかのResources/animations/grossi_blue.plistをパクってきた。これをxcodeで開いて編集。

  • Root/texture
    • もとになる画像の縦横サイズを設定
  • Root/frames
    • アニメーションフレームの定義。フレームの名前を付けて、表示サイズなどの設定を行う。offsetX/Yがわからない(表示するときのずらし量だろうか?)

コードはTestCpp/SpriteTest/SpriteTest.cpp SpriteFrameTest::onEnter() の辺を持ってくる。こげなかんじ。

    auto pSprite = Sprite::create("majo.png");
    pSprite->setPosition(Point(100,100));
    this->addChild(pSprite);

    
    auto cache = SpriteFrameCache::getInstance();
    cache->addSpriteFramesWithFile("majo.plist", "majo.png");
    
    auto s = Director::getInstance()->getWinSize();
    auto _sprite1 = Sprite::createWithSpriteFrameName("majo_01.png");
    _sprite1->setPosition( Point( s.width/2-16, s.height/2) );
    
    auto spritebatch = SpriteBatchNode::create("majo.png");
    spritebatch->addChild(_sprite1);
    addChild(spritebatch);
    
    Vector<SpriteFrame*> animFrames(3);
    
    char str[100] = {0};
    for(int i = 1; i < 3; i++)
    {
        sprintf(str, "majo_%02d.png", i);
        auto frame = cache->getSpriteFrameByName( str );
        animFrames.pushBack(frame);
    }
    
    auto animation = Animation::createWithSpriteFrames(animFrames, 0.5f);
    _sprite1->runAction( RepeatForever::create( Animate::create(animation) ) );

これは、Layerのinitで実行している。実行すると魔女っ子がとことこあるく。

次はAction

ここはcocos2dxでも特徴のある部分かと思う。なんとなく使いどころのイメージは湧いてるが、さてはて。。。

とりあえずこちらのサイトは役立ちそうだ。いろんなActionのScreenShotがみることができる。

魔女っ子をEasingして永遠にうろうろさせるアクションをつくったみた。
ちょろっとActionについて調べてみたが、自分の作りたいものを作るには、一般的なX/Yに自分で値を足していってというアプローチをとるほうが良さそう。でもせっかく作ったのでコードは張っとく

    // create move actions
    {
        auto seqActs = Vector<FiniteTimeAction*>();
        {
            auto spawnActs = Vector<FiniteTimeAction*>();
            
            auto mv = MoveBy::create(2, Point(0, -50));
            auto es = EaseInOut::create(mv, 10);
            spawnActs.pushBack( es );
            
            mv = MoveBy::create(2, Point(50, 0));
            es = EaseInOut::create(mv, 10);
            spawnActs.pushBack( es );
            
            auto actSpawn = Spawn::create( spawnActs );
            seqActs.pushBack(actSpawn);
        }
        {
            auto spawnActs = Vector<FiniteTimeAction*>();
            spawnActs.pushBack( MoveBy::create(2, Point(0, 50)) );
            spawnActs.pushBack( MoveBy::create(2, Point(-50, 0)) );
            auto actSpawn = Spawn::create( spawnActs );
            seqActs.pushBack(actSpawn);
        }
        
        auto actSeq = Sequence::create(seqActs);
        
        _sprite1->runAction(RepeatForever::create(actSeq));
    }

Unitクラスを作ってみる

さて、古き良きゲームオブジェクト指向設計に則ってUnitクラスをつくってみる。まぁWorkだとか、Taskだとかいろいろ呼び方はあるだろうけど、ゲーム中のキャラとか弾とかのオブジェクトに当たるクラスということで。
cocos2d::Nodeを継承して、そこに先ほど作成したSprite関係のやつをぶっ込んだらとりあえず絵のでるUnitクラスが出来上がる。

memo

単にupdateをoverrideしただけでは、コールされない。scheduledUpdate()を実行しておく必要がある。

memo2

時間に関するキャラの属性変更に関してはActionを継承して独自に作る。UnitではStateやスプライトの管理を行うってのがあってる???

memo3

Componentクラスってなんだろう?これはユーザが継承して使うって良いようなものなんだろうか

cocos2d-xでがんばってみる

ただいまがんばり中。
cocos2d-xのアプリケーション構造を勉強中。
爆裂カブトムシ的なスマートフォンアプリをつくるのが目標。

作りながらメモってることもあるので、もしかしたら全然間違ってること書いてるかもしれないけど、ごめんなさい

SceneとLayer

cocos2dその2。Scene, Layer , Sprite
http://ameblo.jp/hash-r-1234/entry-10934976484.html

自分がやってるのは3.0のほうで、このかたは2.xのほうみたいだけど。仕組みはほとんどかわってないという噂。
なるほど、Sceneでその中にLayerか。素直に、GameMainSceneと、UILayer, EffectLayer, CharactorLayer, BgLayerみたな感じかしら。
で、各Layer内にSpriteおいて描画する感じ。わかりやすい。
※想像で書いています

override

C++11のfinalとoverride
http://cpplover.blogspot.jp/2013/04/c11finaloverride.html

keywordとしてoverrideが追加されていた。これをちゃんと使うことでoverrideしていることを宣言できる。overrideした関数かどうかって一見分からないという問題に有効だな。