みつろぐ

やれることはやってみる

【Unity】編集しているシーンとは別のシーンから再生し、終了時に元のシーンへ戻る方法

Unityでゲーム開始時のシーンとは別のシーンで作業をしている時、デバッグのためにシーンを遷移しなければならないのが億劫だったのでエディタ拡張を用意しました。

下記スクリプトを適当なAssets/Editor以下に置くと使えるようになります。

[InitializeOnLoad]
public class StartGame : ScriptableObject
{
    static StartGame()
    {
        EditorApplication.playModeStateChanged += (a) => {
            if (EditorApplication.isPlayingOrWillChangePlaymode && ! EditorApplication.isPlaying) {
                EditorPrefs.SetString("editScenePath", EditorSceneManager.GetActiveScene().path);
                EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
                EditorSceneManager.OpenScene ("Assets/Scenes/Main.unity");
            } else if (!EditorApplication.isPlayingOrWillChangePlaymode && ! EditorApplication.isPlaying) {
                EditorSceneManager.OpenScene(EditorPrefs.GetString("editScenePath"));
            }
        };
    }
}

やってることとしてはEditorApplication.playModeStateChangedでPlayMode(ゲームの再生/終了)が切り替わったときにシーンの切り替えをやっているだけです。

Golangで複数DBの設定を管理する方法を考えてみる

最近Golangを勉強中です。

Golangなアプリケーションで、複数のDBへ接続する機会があるかどうかはさておき、調べても良い方法が見つからなかったので書いてみた。

今回は設定ファイルの管理に BurntSushi/toml を使ったが、go-yaml/yaml でもよさそう。 ちなみに設定ファイルは以下のような形式を想定してる。

[hoge.master]
database = "hoge"
user = "root"
password = "root"
host = "127.0.0.1"
port = 3306

[hoge.slave.0]
database = "hoge"
user = "root"
password = "root"
host = "127.0.0.1"
port = 3306

[hoge.slave.1]
database = "hoge"
user = "root"
password = "root"
host = "127.0.0.1"
port = 3306

実際に設定を読み込むコードがコチラ

package config

import (
    "log"
    "os"
    "strings"

    "github.com/BurntSushi/toml"
)

type Database struct {
    Name     string
    User     string
    Password string
    Host     string
    Port     int
}

var databaseConfigs = loadDatabaseConfigs()

func loadDatabaseConfigs() interface{} {
    var fpath = "resource/config/database.tml"
    var configs interface{}
    if _, err := toml.DecodeFile(fpath, &configs); err != nil {
        log.Fatalln("[ERROR] : failed to read '" + fpath + "'")
    }
    return configs
}

func GetDatabase(args ...string) Database {
    var config = databaseConfigs
    for _, arg := range args {
        config = config.(map[string]interface{})[arg]
    }
    c := config.(map[string]interface{})
    return Database{c["database"].(string), c["user"].(string), c["password"].(string), c["host"].(string), int(c["port"].(int64))}
}

BurntSushi/toml のサンプルコードではパースした結果の構造体が定義されているサンプルがあるが、interfaceを活用してパースの結果を受け取ることもできる。 結果的に、GetDatabase("hoge", "master")とかGetDatabase("hoge", "slave", "0")とかすれば、簡単にDBの情報が取得できるようになった。

設定ファイルの読み込み先などを環境変数によって制御するようすれば、local環境やprod環境での切り替えもできると思う。

いつでもAffectionな気持ちになりたい

これはゆゆ式AdventCalendar 2016 11日目の記事になります

本AdventCalendar初日にid:esuji5さんが取り上げてくださっているように新作OVAが2月22日に発売が決定、新OP/EDとキャラクターソングアルバムに加えてイベント開催決定と来年もゆゆ式な1年になると思うと胸が熱くなります。
d.hatena.ne.jp


さて、ゆゆ式といえばOP「せーのっ」で五臓六腑に染み渡る津田さんの歌声もいいですが、個人的にはすべてを忘れて脳汁だけが流れ続けるED「Affection」も好きです。
「せーのっ」を拝聴し続けるとすぐに歌いそうになってしまうため、今回はいつでもAffectionな気持ちになれるツールを作ってみました。
f:id:Mitu217:20161211220021p:plain

画面右下に表示されるデスクトップアイコン的なアプリとなっているため、少し容量は思いですがぜひ使ってみてください。zipファイルを解凍してでてきたAlwaysAffectionというファイルが実行ファイルとなります。
AlwaysAffection


以下は作成記録です。NW.jsの導入方法やビルド方法については今回触れません。

  1. まずはAffectionを拝聴しながら素材をゲットします

f:id:Mitu217:20161211220837p:plain

  1. いい感じにGIFへ編集します。今回はあまり時間がなくPhotoShop先生に頼りきってしまいましたので、あとで調整したい…

f:id:Mitu217:20161211221022g:plain

  1. NW.jsでGIF画像を表示するだけのアプリを作ります
{
	"name": "AlwaysAffection",
	"main": "index.html",
	"version": "1.0",
	"window": {
			"width": 200,
			"height": 250,
		"icon": "icon.png",
		"transparent": true,
		"toolbar": false,
		"frame": false,
		"always_on_top": true,
		"show": false
	}
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>いつでもAffection</title>
</head>

<style>
html {
  height: 200px;
  width: 200px;
}
body {
  margin: 0;
  height: 100%;
  width: 100%;
  background-color: rgba(0, 0, 0, 0.0);
  color:#fff;
  -webkit--app-region: drag;
}
.content {
  position: absolute;
  bottom: .25rem;
  right: 0rem
}
</style>

<script>
  var gui = require('nw.gui');
  var win = gui.Window.get();
  win.moveTo(
    window.screen.availWidth - win.width,
    window.screen.availHeight - win.height
  );
  win.show();
</script>

<body>
  <div class="content">
    <img src="Affection.gif" width="200" height="200" border="0" align="center" hspace="10" vspace=10 loop=infinite ondragstart="return false;"  oncontextmenu="return false;">
  </div>
</body>
</html>
  1. あとはビルドをして実行すれば完成!

f:id:Mitu217:20161211221909p:plain


動きがそこまで激しくないため常に表示しても邪魔に感じないので、さすがゆゆ式というところです。


雑な記事になってしまいましたが、以上となります。
明日はid:masaybloveさんで4コマ漫画を書いてくれそうな雰囲気で非常に楽しみです。よろしくお願いいたします。

ThinkPadx260とWigigDockの使用感とか

先日購入したThinkPadX260とWigigDockの使用レポート的な記事です。購入の経緯などは過去記事を参照ください。

mitu217.hatenablog.jp


ざっくりと良かった点、気になった点は次の通りです

ThinkPadX260

  • 画面サイズは小さくなったがそこまで気にならない
  • キーボードとトラックポイントは安定している
  • SDカードEthernetが直接させる安心感
  • (3セルだと)バッテリーの持ちがイマイチ
  • 指紋認証の精度がイマイチ…

WigigDock

  • 電源Onから5秒前後でPCと接続される
  • USBも自動で接続されるので便利!
  • 接続中のバッテリー消耗率は気にならない
  • ファンの音が気になる
  • 出力できるのはHDMIかDPのどちらか
  • 4k出力ができない(2kまで)


ThinkPadX260については以前使用していたMaxBookAir(Mid2013)との比較になります。
購入の際、新型MacBookProも候補ではありましたが写真の取り込みやらスパイのOS焼きなどでSDカードを頻繁に使う私としては直接読み込みが出来るのは大きな利点だったと感じています。まだUSBtypeCのケーブルはハードルが高い…
ただ今回失敗したと感じた点はバッテリーのセル数を増やさなかったこと、指紋認証をつけたことです。前者は今後バッテリーを買い足せば良いので問題ないのですが、後者はせっかくログインなどに使用できるのに残念で仕方がありません。今後アップデートなどで精度が改善される可能性もありますが、今のところオプションとしてつける利点は低いかなと感じました。

WigigDockについてはすごく未来を感じました。
現在メインモニタにDELLU3415Wを使用しているため、デスクトップ機とキーボードやマウス、スピーカーの共有をモニタ側でおこなっているのですが、USBケーブルをDockに接続しただけで無事に動作しました。
これにより、Dockの電源さえつければモニタ拡張,キーボード,マウス,スピーカーが接続された環境が即座に完成するようになりました。
前述させていただいた気になる点についてはファンの騒音だけは気になるところですが、他は仕様と割り切れば気にせず十分利用が可能だと思われます。


手元に到着してから約10日ほど経過し、ハードウェアというよりはWindowsそのものに疲弊することはありつつも、下手に新型MacBookProのあのペタペタキーボードを使うよりは満足度は高かったのかなと感じていますが。現時点でインターネットにあるレビューを見る限り「慣れれば使える」というコメントが多く、全く褒めてる記事が見当たらないですからね…
以上、簡単な使用感レビューでした。

ThinkPadX260購入 + おまけ付き

これまでUnity以外の開発はMacBookAirを使っていたのですが、バッテリーが充電されにくいなどの現象が頻発するようになり買い替えを検討していました。

タイミングよく新型MacBookProが発表されるも、「あんだかな~」という気持ちだったので思い切ってWindowsにしてみようとThinkPad購入に踏み切りました。

以下、購入したスペックとかとか
f:id:Mitu217:20161116235453p:plain

ちょうど42%OFFクーポンを利用できたので、最終的には138,748円ぐらいでした。
カスタマイズ時にはHDDを選択し以下のSSDに換装しました。新品を即日換装するのはドキドキです。
Amazon CAPTCHA


これまでより画面が小さくなるので、慣れるまで大変かなと考えていたのですがいい意味で裏切られました。

同時にWigigDockも購入したため、後日それらのレビューもしていきたいと思います。


f:id:Mitu217:20161117000752j:plain

MusicBeeでNowPlayingをつぶやく、アートワークも出力します

自宅では音楽管理にMusicBeeを利用しています。
MusicBeeは機能が充実しているのに加えて、デフォルトで綺麗なテーマが多数用意されてるのでおすすめです。

MusicBeeでは「Social Networks Status」というプラグインを使えば、簡単にNowPlayingをTwitterFaceBookなどに投稿することができるのですが、いかんせんテキストのみになってしまうため非常に残念です。


そこで、プラグインを改造してアートワークを同時に呟けるようにしてみました。まずは以下のサイトを参考にプラグインの導入をおこなってください

NetskyのPC、音楽なんでもblogMusicBee Plug-in for twitter MusicBeeで再生中

  1. ここのDownload欄のSourceから、最新プロジェクトをDL
  2. 解答したフォルダにあるSocialNetworksStatus.slnをダブルクリックしてプロジェクトを開きます
  3. SocialNetworksStatus.csを次のように書き換え
  4. メニューの「BUILD/Build Solution」からビルド
  5. 生成された「mb_SocialNetworksStatus.dll」をProgramFile/MusicBee/Pluginsにコピー
// ソースファイルの先頭に追加
using System.IO;

// TwitterServiceクラス内
public bool updateStatus(string status, string imagePath = "")
{
    try 
    {
        if (imagePath == "") {
            TwitterStatus result = service.SendTweet(new SendTweetOptions
            {
                Status = status,
            });
        } else {
            using (var stream = new FileStream(imagePath, FileMode.Open))
            {
                var result = service.SendTweetWithMedia(new SendTweetWithMediaOptions
                {
                    Status = status,
                    Images = new Dictionary<string, Stream> { { "artwork", stream } }
                });
            }
        }
    } 
    catch (Exception ex) 
    {
        if (ex.Message != "Status is a duplicate")
            MessageBox.Show(ex.Message);
    }

    Plugin.MbApiInterface.MB_SetBackgroundTaskMessage("");

    return true;
}

// Pluginクラス内
public void updateStatusEventHandler(object sender, EventArgs e)
{
    string status = GetStatusText(MbApiInterface.NowPlaying_GetFileUrl());

    //Facebook
    if (facebookService != null) {
        MbApiInterface.MB_SetBackgroundTaskMessage(UpdateStatusCommandSbText);
        facebookService.updateStatus(status);
    }
            
    //Twitter
    if (twitterService != null) {
        MbApiInterface.MB_SetBackgroundTaskMessage(UpdateStatusCommandSbText);
        twitterService.updateStatus(status, MbApiInterface.NowPlaying_GetArtworkUrl());   
    }

    //VKontakte
    if (vkService != null) {
        MbApiInterface.MB_SetBackgroundTaskMessage(UpdateStatusCommandSbText);
        vkService.updateStatus(status);
    }
}

これでアートワーク付きのNowPlayingがつぶやけるようになるはずです。


# 参考サイト
Tutorial: Creating A Simple Plugin - MusicBee Wiki - Wikia
Post message with image on twitter using C# - DotNetFunda.com

【Unity】GameView上のマウス座標の取得方法

Unityエディタ上でタッチイベントをデバッグするときに、現在ではデフォルトでタッチがマウスのクリックイベントとしてシミュレートされてしまうのでInput.simulateMouseWithTouchesのパラメータを変更する形で分離する方法を紹介しました。
mitu217.hatenablog.jp

ただ、なぜかシミュレートをDisableにしてもInput.mousePositionがタッチイベントに上書きされてしまうので、Unityエディタでデバッグ中の時だけ回避できるような処理を実装しました。Unityエディタで実行中の時のみcurrentMousePositionInGameViewを参照するようにすれば大丈夫かと思います。

#if UNITY_EDITOR
private Vector2 currentMousePositionInGameView;
void OnGUI()
{
	var x = Event.current.mousePosition.x;
	var y = Screen.height - Event.current.mousePosition.y;
	currentMousePositionInGameView = new Vector2 (x, y);
}
#endif