さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

やること2017

 あけましてた。

MSTリリース

 いま開発中のやつ。

 上半期を目標。ただ完成したら即リリースするかっていうとそうでもなくて、ある程度外的要因によって前後するかも。…いや、早くなることはないか。イベント合わせにするとかでズレる。まあそれでも上半期中には何とかなってるっしょ。

 あと今回はパロディではなく一次創作なので、リリース後はその辺を活かしてなんかできればなあ、とか。皮算用な。

例大祭、遊宴雀参加

 なんか出すよ。ちょい他力本願になる予定。

bitsummit5

 ブース申し込んでみたけど、どうなるかは知らね。

ブログ

 技術的な記事をちょろちょろ参照してもらえたりがあったので、引き続き書いていければなあと。幸か不幸かUnityはまだ枯れそうにないわけだし。

下半期

 なんもわからん。生きる。

ゲームの紹介ページにOGPを設定すること

ページを作ったら

moetoku.sakura.ne.jp

 ゲームの紹介ページなんかを作ったら、TwitterとかブログにURLを張る。

 そのとき、ブログカード形式でリンクが表示されればいいよね。ということで、表示されるようにする。

OGP設定する

 htmlにメタデータを埋め込んでやればよい。詳しくはOGPでググろう。

 だいたいこんなん。

<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
    <meta charset="utf-8" />
    <meta property="og:title" content="MagicScrollTactics" />
    <meta property="og:type" content="website" />
    <meta property="og:url" content="http://moetoku.sakura.ne.jp/mst/" />
    <meta property="og:image" content="http://moetoku.sakura.ne.jp/mst/img/thumb.png" />
    <meta property="og:site_name" content="同人ゲームサークル オートリ電子" />
    <meta property="og:description" content="横スクロールSRPG MagicScrollTacticsのページ" />
    <meta name="twitter:card" content="summary">

twitterにも適用する

 Card validatorに登録してやる必要がある。

はてなブログで使う

 はてなでブログでカード形式リンクを使うには、index.htmlまで記述しなきゃいけないぽい。これで躓いた。

 ふぇーすぶっくはつかっていないのでしりません。

【Unity】CloudBuildでうまくいかない場合対応

概要

 以下の条件において、UnityCloudBuildでビルドしたものが上手く動かない場合の対応方法。

条件

  • windows環境で開発していて
  • Resourcesフォルダ下のファイル名に濁点/半濁点がある

 上記の条件をみたすとき、Resources.Load, Resources.LoadAsyncに失敗してコケる。

ナンデ?

 UnityCloudBuildのログを見ると、ファイル名がNFDになっていることがわかる。このためにファイルが見つからずにロードに失敗する。

5871: [Unity] Updating Assets/Resources/AbilityEffects/ヤンシャオグイ.asset - GUID: 407fd122216a3674f90de5822614aed0...

 テキストエディタとかにコピペしてみよう。

対応

 ロードする際のパスをNFDに変換してやれば良い。

1.シンボル定義

 処理を分けるため、CloudBuildの設定でシンボルを定義する。

f:id:enuenupi:20161219133230p:plain

2.ロード処理時にstring.Normalize

public T Load(string path)
{
#if CLOUD_BUILD
    path = path.Normalize(System.Text.NormalizationForm.FormD);
#endif
    return Resources.Load<T>(path);
}

 そもそもファイル名に日本語を使わないのが無難だけど、なんだかなあ。

+

【Unity】複数個所から安全にTime.scaleを操作する

あかんパターン

 たとえば一時停止処理などでTime.scale0fを入れて時間を止め、なんやかんやした後に1fを入れて戻す処理を書くとする。

 この時、なんやかんやしてる内部でTime.scale1fを入れてしまうと、勝手に時間が動き出してしまいマズイ。

やること

 いろんなところでTime.scaleを操作すると何かと問題が起こりやすい。そこで管理クラスを作る。

コード

gist.github.com

使い方

Time.scale = 0f;

// なんやかんや

Time.scale = 1f;

としているところを

var timeScaler = new TimeScaler();
timeScaler.SetScale(0f);

// なんやかんや

timeScaler.SetScale(1f);

 とする。

 変更した本人が1fに戻さないと永遠に戻らないので注意。それが流儀。

【Unity】Resources.LoadAsyncするけどパス指定したくない

やること

 ロード処理においてResources.LoadAsyncを使いたい。が、いちいちパス指定するのが嫌、という場合のための仕組みをつくる。  

コード

gist.github.com

使い方

 アセットのクラスごとに継承したクラスを作る。

using UnityEngine;
using System.Collections;

namespace TSKT
{
    public class PrefabReferer : ResourceReferer<GameObject>
    {
    }
}

 ScriptableObjectファイルを作成して、インスペクタでassetフィールドにResourcesフォルダ下のファイルを紐づける。

 すると、pathフィールドが自動で更新される。

 で、実行時にLoad()を呼び出すと、pathフィールドを使ってResources.LoadAsyncを行う。

参照

 ロード処理は前回のResourceLoaderを使っている。

toriden.hatenablog.com

びみょう?

 わざわざScriptableObjectファイルを作るのが面倒。

 [Serializable]なクラスを作ってその中で処理できれば最高だったんだけど、OnValidate相当の機能がなさそうだったのであきらめた。

 OnValidateさえあれば、参照しているassetファイルからパスを取得し、pathフィールドを自動更新する処理を書くことができる。

修正

 UNITY_EDITORを使ってビルド時にフィールドを減らしたりするとエラーになるので良くない。というわけで回りくどいけどguidを取得してやることにした。

answers.unity3d.com

【Unity】ResourceLoaderクラス

やること

 Resources.LoadAsync<T>を処理する便利クラスをつくる。

 これによって、たとえば、Resources.LoadAsync<T>はせっかくジェネリックメソッドなのに、assetを取り出すときにはキャストが必要、とかの煩雑さを解決する。

コード

gist.github.com

使い方

 newしてyieldで待つ。

 取り出すときにはasset as Tのようなキャストが不要。

var loader = new ResourceLoader<Hoge>("path");
yield return loader;
var hoge = loader.Asset;

 クラスなので、↓のように継承することで機能を足せる。

public class HogeLoader : ResourceLoader<Hoge>
{
    public HogeLoader(string path) : base(path)
    {
    }
    public HogeLoader(int id) : base("Hoge/" +id.ToString())
    {
    }
}