【Unity】ScriptableObjectの基本と応用について

今回はScriptableObjectの基本機能の解説と、Editor拡張と合わせた応用事例の紹介をします。

こんにちは、ソーシャルゲーム事業部所属エンジニアのぴーちんです!!宜しくお願いします

この記事はカヤックUnityアドベントカレンダー2016の6日目の記事になります。

ScriptableObjectの基本と応用について

ScriptableObjectは、Unityによってシリアライズされたデータ群をアセットとして保持する為の仕組みです。 Prefabと一見似てる様に思われますが、Prefabの様にシーン上に配置する使い方は出来ません。

詳細は公式のマニュアルを見ると良いでしょう。

ScriptableObjectの作り方

ここでコードを交えて作り方の紹介

ScriptableObjectにしたい場合は、 ScriptableObjectを継承する必要があります。 今回はScriptableObjectにしたいclassと、そのScriptableObjectのinstanceを作成するEditorToolを以下に書いてみました。

using UnityEngine;
using UnityEditor;

public class TestScriptableObject : ScriptableObject
{
    public string imageUrl;

    public Texture2D icon;
}
using UnityEngine;
using UnityEditor;


public class TestScriptableObjectCreater : Editor
{
    [MenuItem ("Test/CreateScriptableObject")]
    static void Create()
    {
        var instance = CreateInstance<TestScriptableObject>();

        AssetDatabase.CreateAsset(instance, "Assets/00TestScriptableObject/TestScriptableObject.asset");
        AssetDatabase.Refresh();
    }
}

UnityのMenuにある Test→CreateScriptableObject を選択すると、Assets/00TestScriptableObject/TestScriptableObject.asset が生成されました。

f:id:pchin:20161206102223p:plain

以上がScriptableObjectを作る方法でした。

Editor拡張と組み合わせる

ScriptableObjectは主にUnityのEditor拡張機能と組み合わせて使う場合が多いです。 例えば、以下の様な場合があります。

  • ツールの設定ファイル
  • マスターデータ

ツールの設定ファイルとしての使用例

今回はFacebook SDK for Unityを参考にして紹介しましょう。

FacebookのAPIを使用するための設定項目をScriptableObjectで設定可能な設計になっています。 SDKなどの様にコードをDLLにまとめるケースが多いと、設定ファイルを外出し出来て、しかもGUIで設定を行えるのは便利ですね。

f:id:pchin:20161206102221p:plain

マスターデータ

ScriptableObjectをモックゲームのマスターデータとして扱う場合もあります。

社内の本番環境での使用例はまだありませんが、小規模なゲームやモックを作る場合での使用はアリだと思います。 以下の様なオススメする理由があります。

  • ScriptableObjectはUnityEngneの内部(C++)で実装されてるので読み込みが早い
  • UnityEditor上でデータをInspectorから編集可能なので、ゲームを実行して確認して修正するサイクルを早く回せる

以下はサウンドのマスターデータを格納してるScriptableObjectの例です。 小規模なゲームプロジェクトで、サウンドに関するマスターデータをScriptableObjectに保持される事例を紹介します。

f:id:pchin:20161206102218p:plain

UnityのシリアライズされたAssetは人間が読みやすいテキスト形式にする事が可能です。

yaml形式ならば、Unity以外の場所でもデータの検証がしやすいので便利ですね!

データの更新があった場合でも、行単位でgitのdiffが出るのでレビューもしやすいです。

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_PrefabParentObject: {fileID: 0}
  m_PrefabInternal: {fileID: 0}
  m_GameObject: {fileID: 0}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: c5a9d5d57f4c8457a9b5d4cbc08c8ccc, type: 3}
  m_Name: sound
  m_EditorClassIdentifier: 
  sheetName: "\u30DE\u30B9\u30BF\u30FC\u30C7\u30FC\u30BF\uFF08\u30E2\u30C3\u30AF\u7528\uFF09"
  worksheetName: sound
  dataArray:
  - id: 1
    category: 1
    soundname: battle_normal01_loop
    filename: battle_normal01_loop.wav
    channel: 0
    minvolume: 40
    maxvolume: 40
    minpitch: 100
    maxpitch: 100
    priority: 0
    limitrepeatms: 0
    loop: 1
    startdelayms: 0

Asset Serializationの設定について

Unityでシリアライズされたアセットは、標準設定だとバイナリ形式で保存されるので人間が読めない事が多いです。 弊社では、基本的にすべてのアセットをyaml形式で保存する設定を有効にしています。

この設定は、 Edit->ProjectSettings->Editor から開けるWindowで行えます。 ここで Asset Serializaton の項目で ForceText を選択すると、人間が読める形式でアセットが保存されます。

f:id:pchin:20161206102215p:plain

この事に関する詳細は、公式マニュアルでも説明されています。

おわりに

如何でしたでしょうか? ScriptableObjectという手段を知ってるだけでも、技術的な問題解決の引き出しが増えるのでご活用ください。

明日はUnityでC#を使うときのヒント集についての記事になります。 担当は権くんになります。 お楽しみに。

我が子Macの体温を表示して健康状態を知る。

※ この記事は Tech KAYAC Advent Calendar 2016 6日目の記事になります

皆さんはじめまして、デニール(@ryusukefuda)と申します。
去年のアドベントカレンダーだは"ドレッドヘアのエンジニアが教えるAndroid Wear Watch Faceのつくりかた" という記事を書いたのですが、あれからもう1年経つのですね... 今年はMacユーザーというそれはそれは幅広い人が読める内容でいきたいとおもいます。

はじめに

皆さんはMacの体温とも言うべきCPU温度をどのくらい把握しているでしょうか。
人間世界では親が自分の子どもの体温を測り、熱が高くなったら病院へ行きますよね。
今回はMacでもそれをやった方がいいんじゃないかと思い、やってみました。

CPU温度を測るスクリプト

探してみると、GitHubにちょうど良さそうなリポジトリを発見しました。

github.com

中身を見てみると、IOKit というAppleが提供しているFrameworkを使用してゴニョゴニョしていました。

インストール

READMEの通りソース一式を落としてきて、sudo make install でインストールします。

早速実行してみる

コンソールで実行。

$ /usr/local/bin/osx-cpu-temp
69.9°C

それらしい温度が表示されました。
これが我が子の体温ですね。

どこに表示するか

コンソールから温度を取得することはできましたが、
どこに表示するかという問題が残っています。毎回コンソール叩くのは面倒ですよね。

  • Macアプリをつくる
  • Macのcronにスクリプトをセットして通知させる

などが候補にあがりました。
どれもお手軽感がないですね...

そこでBitBarの登場!

BitBarをご存知でしょうか。 これはMac上部のバーから任意のスクリプトを実行したり、結果を表示させることができるというなんともエンジニア心をくすぐるソフトです。

getbitbar.com

インストール

Release v1.9.2 · matryer/bitbar · GitHub からBitBar.app.zipをダウンロードし、解凍した後/Applicationsフォルダにコピーするだけでインストール完了です。

挙動確認

BitBarはサイトに様々なプラグインがあり、自由にダウンロードして実行することができます。
BitBarの左メニューから好きなプラグインをダウンロードしてバーに表示させてみてください。

オススメをいくつか紹介します。

BitBar用のプラグインを作成

一瞬で終わります。

#!/bin/bash

echo "`/usr/local/bin/osx-cpu-temp`"

ファイル名を cpu-temp.10s.sh としてBitBarのプラグインディレクトリに保存してください。 BitBarはスクリプトの定期実行をファイル名で設定できます。 上記では10s.shとしているので、10秒毎に温度表示のスクリプトを実行していることになります。

確認

f:id:schile:20161205181618p:plain

ちゃんと表示されていますね。
これで常に我が子の体温を見ることが可能になりました。
安心して生きていけますね。

番外編~どんだけ温度あがるか~

スペック
- MacBook Pro 13inch
- Core i5 - メモリ8GB

PC起動直後

f:id:schile:20161206095458p:plain

平熱

VirtualBoxを起動しRailsのサーバー起動, Chromeも起動。

f:id:schile:20161205182247p:plain

Chromeを起動すると結構上がります。

Lobi Androidビルド

f:id:schile:20161205182545p:plain

ぶっちぎりで上がっております。
このくらいになると私のMacはうなりはじめます。
ちなみにLobi Androidのソースコードは37万行を超えてます。

予告

明日は最近入社したおかむーがフレッシュな記事を書いてくれるのでどうぞご期待ください!