強火で進め

このブログではプログラム関連の記事を中心に書いてます。

ディズニー、ピクサーの最新作「リメンバー・ミー」の VR 作品「Coco VR」


Unity で作られた VR 作品。 Oculus Store にて無料で配信中( Oculus Rift と Oculus Touch が必要です)

ピクサーのプロデューサーが語る「VRで生まれるセンス・オブ・ワンダー」 - VR Watch
https://www.watch.impress.co.jp/headline/docs/extra/vr/1115418.html

Coco VR | Oculus
https://scontent.oculuscdn.com/v/t64.5771-25/q92/s2048x2048/11162732_129362901106567_6535825972556464128_n.jpg?_nc_cat=0&oh=90cd67f9fdbbcef1b57452b204a39a86&oe=5AFA0B51

Unity で作った自作のゲーム世界から放送してるバーチャルユーチューバーを発見


ゲーム世界からの放送だとゲーム実況と同じで、画面に動きが有る放送になるのがとても良いですね。


Lv03 にて作成方法について解説されてました(地形作成などについてだけです。音声制御の実装方法とか他の事についても知りたい!!)。


フライングソード良いなぁ。乗りたい!!


現時点での本編動画の最新話、ゲームデザインについての話とても良い内容でした。
そして、動画の最後には衝撃の展開が…

IBM Watson の Text to Speech で日本語で喋らせる方法

前提

こちらの記事で解説している IBM Cloud アカウントの作成や IBM Watson Unity SDK のインストールが完了しているプロジェクトが準備されている前提で解説します。

コードを編集

Assets/Watson/Examples/ServiceExamples/Scripts/ExampleTextToSpeech.cs を開き、以下の様に2箇所のコードを変更する事で日本語を喋らせれます。日本語の文章の場合に途中に英語が入る場合も有りますがその様な場合にも正しく読み上げてくれるみたいです。

string _testString = "<speak version=\"1.0\">test.こんにちは。hello.</speak>"; // 英語と日本語が混ざっても大丈夫かテスト
_textToSpeech.Voice = VoiceType.ja_JP_Emi; // 日本語のボイスを設定

使用可能なボイスはこちらのページで確認できます。今のところ、日本語は ja_JP_Emi という女性のボイス1つのみ対応しているみたいです。

実際に使われるボイスを事前に聴きたい場合にはこちらのページで試せます。

Google Maps API がゲームで活用可能に。 Unity にも対応


昨夜、 Google Maps APITwitter アカウントから以下の様なツイートが行われました。

Google Maps API を使って現実世界をゲーム内に構築できる、しかも Unity にも対応との事です。

Google Maps APIs  |  Google Developers
https://developers.google.com/maps/gaming/


作成事例

紹介ページには作成事例の動画も上がっていました。


まだ「セールスにご連絡下さい」な状態になっていますがページの最後にこの様な記述も有るので恐らく GDC でもう少し詳細が公開されるのでは無いでしょうか?

関連情報

Google Map APIとUnityで“リアルワールドゲーム”開発が容易に - ITmedia NEWS
http://www.itmedia.co.jp/news/articles/1803/15/news061.html

GitHub で自分のリポジトリを Fork (フォーク)する方法

※実際には Fork は出来ませんでしたがほぼ Fork と同様な処理は可能でした。

GitHub で自分の Repository を Import しようと、該当リポジトリの Fork ボタンを押してみました。

しかし、このボタンでは別の Organization (別に所属している組織のリポジトリへインポート)へは可能みたいですがデフォルトのリポジトリと同じ所にはこのボタンから Fork 出来ないみたいです。

次に試したのこちらの「Import repository」。

こちらはインポート処理の途中でパスワード入力が促されたので入力しましたが以下の様に表示されエラー。

Your old project requires credential for read-only access
We will only temporarily store them for importing.

何度かログインを試した後に「もしかして、二要素認証(Two Factor Authentication / 2FA)を使っているのが問題かな?」と気が付き、 Personal access tokens のページでトークンを作成し、パスワード欄に入力すると無事インポート出来ました。

IBM Watson の Visual Recognition を Unity から使う方法

Visual Recognition は画像を解析し、どのようなものなのかをテキストで返すサービスです。

[サービス情報]

Visual Recognition - IBM Cloud
https://console.bluemix.net/catalog/services/visual-recognition

[公式のチュートリアル]

概説チュートリアル
https://console.bluemix.net/docs/services/visual-recognition/index.html#-


[公式のドキュメント]

unity-sdk/Scripts/Services/VisualRecognition/v3 at develop · watson-developer-cloud/unity-sdk
https://github.com/watson-developer-cloud/unity-sdk/tree/develop/Scripts/Services/VisualRecognition/v3

アプリの作成手順

Visual Recognition を使った Unity アプリの作成手順を解説します。

基本的な共通で必要な作業はこちらの記事で解説しています。
こちらが未読の場合には先にそちらを確認し、 IBM Cloud アカウントの作成や IBM Watson Unity SDK のインストール作業などを済ましておいて下さい。

サーバ側の作業

まずはサーバ側の設定作業を行います。

こちらのページ経由でサーバにプロジェクトを作成します。
ページの右下に有る「作成」のボタンを押して、プロジェクトを作成して下さい。

新規資格情報を作成します。

デフォルトの状態のままで「追加」ボタンをクリック。

「資格情報の表示」をクリックして、展開。


後で使うのでここの情報をメモっておきます。
note の部分にはユーザへのメッセージが入る様です。「5分後に有効になります」などのメッセージが入っていたりしてました。
※キャプチャ画像の note は一度削除してから作り直したので異なるメッセージに成っています。

左側のタブから「管理」に切り替え、ツールを起動します。

ツールの初回起動時には API Key の入力が求められるので先程メモした中に有る api_key の値を入力します。


するとこの様な画面に切り替わります。ここでは画像解析の学習を行わせた分類器(Classifier)を作成します。新規に作成する為に「Create classifier」ボタンをクリックします。

学習用のデータを以下の様に設定します。画像データは IBM Watson Unity SDK をインストール済みの Unity のプロジェクトの場合、 Assets/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers に有ります。
ここでは giraffe_positive_examples.zip と negative_examples.zip を使って設定する事にします。

※学習データの zip ファイルは最低「正しいもの」2つ、もしくは「正しいもの」1つ、「間違っているもの」1つ準備する必要が有ります。

作成が完了するとこの様な表示に成ります。

赤枠の部分で画像ファイルを選択するとテストできます。分析したい画像を選択し、テストをしてみましょう。

ここでは Assets/Watson/Examples/ServiceExamples/TestData/visual-recognition-classifiers フォルダに有る giraffe_to_classify.jpg と turtle_to_classify.jpg を使ってみます。


ちゃんと判定出来ている事が確認できます。

Unity での作業

サーバ側の作業が終わったので次に Unity 側の作業を行います。
Unity のプロジェクトを新規作成し、 IBM Watson Unity SDK を Import 。
Assets/Watson/Examples/ServiceExamples/Scripts/ExampleVisualRecognition.cs を開き、以下の部分を見つけます。

ここに先程メモした url と api_key の値を記述します。

public class ExampleVisualRecognition : MonoBehaviour
{
    private string _apikey = null;
    private string _url = null;

Scene に新規に GameObject を作成し、このファイルをアタッチし、実行して下さい。

すると 〜Attempting to get all classifiers というメッセージの後に以下の様なメッセージが表示されます。

{"classifiers":[{"classifier_id":"\u52d5\u7269_693641681","name":"\u52d5\u7269","status":"ready"}]}

ここで表示されているものは自作した分類器(Classifier)を全て取得する API のレスポンスです。
「classifier_id」が「\u52d5\u7269_693641681(動物_693641681)」、「name」が「\u52d5\u7269(動物)」で有る事が確認できます。

classifier_id は他の API で使用するのでここの値で有る事を覚えておいて下さい。

関連情報

[Watson] Visual Recognition Tool を利用して画像解析を試す - Qiita
https://qiita.com/y-some/items/6addf597a81a48f04d59

エディタ拡張でちゃんと Retina 対応する方法

こちらのプルリクによると EditorGUIUtility.pixelsPerPoint を使うのが良いみたいです。

Unity-Technologies / cinematic-image-effects / Pull request #17: [tcg] Retina support for Unity 5.4+ (color wheels). — Bitbucket
https://bitbucket.org/Unity-Technologies/cinematic-image-effects/pull-requests/17/tcg-retina-support-for-unity-54-color/diff

返す値が 2 なら Retina

Unity - Scripting API: EditorGUIUtility.pixelsPerPoint
https://docs.unity3d.com/ScriptReference/EditorGUIUtility-pixelsPerPoint.html

マウスの情報についてはこちら。

Unity - Scripting API: HandleUtility.WorldToGUIPoint
https://docs.unity3d.com/ScriptReference/HandleUtility.WorldToGUIPoint.html

Unity - Scripting API: HandleUtility.GUIPointToWorldRay
https://docs.unity3d.com/ScriptReference/HandleUtility.GUIPointToWorldRay.html

使用例1 - CustomEditor の OnSceneGUI()

CustomEditor の OnSceneGUI() で EditorGUIUtility.pixelsPerPoint を考慮しないで描画処理を記述すると Retina 対応のディスプレイではこの様な描画結果になります。

Scene View のサイズが 800x500 の時に 400x100 のボタンを描画したにも関わらず、横幅一杯のサイズのボタンが描画されています。

ちゃんと EditorGUIUtility.pixelsPerPoint を考慮したプログラムは以下の様になります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(OnSceneGUISample))]
public class OnSceneGUISampleEditor : Editor {
    Rect ScaledRect(Rect rect)
    {
        var s = EditorGUIUtility.pixelsPerPoint;
        rect.x /= s;
        rect.y /= s;
        rect.width /= s;
        rect.height /= s;
        return rect;
    }

    void OnSceneGUI()
    {
        var sceneCamera = SceneView.currentDrawingSceneView.camera;
        var cameraRect = sceneCamera.pixelRect;

        Handles.BeginGUI();
        Rect labelRect = ScaledRect(new Rect(5, 5, cameraRect.width-10, 40));
        GUI.Label(labelRect, string.Format("size:{0}x{1}", cameraRect.width, cameraRect.height));
        var buttonRect = ScaledRect(new Rect(0, 100, 400, 100));
        if (GUI.Button(buttonRect, "Test"))
        {
            Debug.Log("Push!");
        }
        Handles.EndGUI();
    }
}

この場合には正しく、画面の半分のサイズで描画されている事が確認できます。

使用例2 - クリックした位置に赤い SphereGizmo を表示

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class Test : MonoBehaviour {
#if UNITY_EDITOR
    bool debugClick = false;
    Vector2 debugClickPos;
#endif
    void Start()
    {
        // ここでは正しい値を返さない
        // Debug.Log(EditorGUIUtility.pixelsPerPoint);
    }
    void Update()
    {
        // ここでは正しい値を返さない
        // Debug.Log(EditorGUIUtility.pixelsPerPoint);
    }
#if UNITY_EDITOR
    void OnDrawGizmos()
    {
        // ここでは正しい値を返す
        // Debug.Log(EditorGUIUtility.pixelsPerPoint);

        if (Event.current.type == EventType.MouseUp)
        {
            var mousePosition = Event.current.mousePosition;
            var ray = HandleUtility.GUIPointToWorldRay(mousePosition);
            debugClickPos = ray.origin;
            debugClick = true;
        }

        if (debugClick) {
            Gizmos.color = Color.red;
            Gizmos.DrawWireSphere(debugClickPos, 0.5f);
        }
    }
#endif
}

関連情報

Scene ビューで Gizmo を使う - 強火で進め
http://d.hatena.ne.jp/nakamura001/20120929/1348925143