トマシープが学ぶ

Unity/VR好きのミーハー初心者 記事内容は自分用のメモ。何も求めないで

3D文字を表示させるLookingGlassコンテンツ制作【文字入力編】

 続き

bibinbaleo.hatenablog.com

日本語

まえはスクリプトを入れないと日本語を使えなかったのですが、今やったら使えました。

f:id:bibinbaleo:20190609212401j:plain

bibinbaleo.hatenablog.com

入力したら表示されるようにする

InputField

テキスト入力は、とりあえず無難にInputFieldを使ってみる.

tech.pjin.jp

InputFieldを置いて、スクリプトを書く。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class fontmaker : MonoBehaviour
{
    public InputField inputfield;

    public void onEndText()
    {
        FlyingText.GetObjects(inputfield.text);
        InitInputField();
    }

    void InitInputField()
    {

        // 値をリセット
        inputfield.text = "";

        // フォーカス
        inputfield.ActivateInputField();
    }
}

そしてInputFieldのOnEndのところにonEndTextを付ける。

f:id:bibinbaleo:20190616204545p:plain

これで入力してEnterを押したら文字が落ちてくるようになった!!

f:id:bibinbaleo:20190616204540p:plain

カーソルの幅とかいろいろ設定できるのでする。

f:id:bibinbaleo:20190616210030p:plain

FlyingText

FlyingTextのスクリプト部分はこんな感じ。

 Vector3 random = new Vector3(Random.Range(-10.0f, 4.0f), 5, Random.Range(-1.5f, 6.0f));
 float size = Random.Range(1.2f, 4.6f);
        FlyingText.GetObjects(inputfield.text,material,edgeMaterial,size,0.25f,5,random, Quaternion.identity);

要素はこんな感じ。(付属のpdfに解説があるよ)

GetObject

(text : String,

material : Material,

edgeMaterial : Material,

size : float,

extrudeDepth : float,

resolution : int,

position : Vector3 = Vector3.zero,

rotation : Quaternion = Quaternion.identity)

サイズと生成位置をランダムにした。

生成位置を変えるだけなら

FlyingText.GetObject ("Hello", new Vector3(0, 5, 10), Quaternion.Euler(0, 90, 0));

みたいに位置と角度だけ指定したらいいけど、sizeも変えるには上みたいにいっぱい他も指定しないといけないみたい。

色を変えたいと思ったけど、過去の自分も試しててできてなかった。

成長したところを見せてやろうか!っと思ったけどめんどくさいからいいや。

マテリアルをグラデーションのあるものにしたら、文字同士の色に変化出るかも

文字全消し

Clearボタンを押したら文字が全部消えるようにしたい

www.sejuku.net

今は3DText(XX)という名前のオブジェクトが生成されているだけ。

f:id:bibinbaleo:20190616215153p:plain

これを全部消すには名前で探す、もしくはテキストを空のゲームオブジェクトの子として生成されるようにして、その子をまとめて消すか。

名前で探すのは重いし、一つだけしか消えない気がするので、子オブジェクトにして消します

qiita.com

 

できたスクリプトがこちら

    public void onEndText()
    {   
        Vector3 random = new Vector3(Random.Range(-10.0f, 4.0f), 5, Random.Range(-1.5f, 6.0f));
        float size = Random.Range(1.2f, 4.6f);
        GameObject obj = FlyingText.GetObjects(inputfield.text,material,edgeMaterial,size,0.5f,5,random, Quaternion.identity);
        obj.transform.parent = parentObj.transform;
        InitInputField();
    }

    public void OnDestroyfont()
    {
        foreach (Transform child in parentObj.transform)
        {
            // 一つずつ破棄する
            Destroy(child.gameObject);
        }
    }

これで子要素になる

obj.transform.parent = parentObj.transform;

 

完璧な挙動!!一発でできて気持ち良すぎる。我天才か?

録画

ゲーム画面を良い感じにキャプチャする方法ないかな

OBSで画面キャプチャで選んだらこんな感じ。

www.youtube.com

こちらのツイートみたいに2Dで動画取りたい。

ちなみにこのスクショはここに保存される。

f:id:bibinbaleo:20190616222906p:plain

取りあえず画像

手振れがひどいけど動画

www.youtube.com

できた

カメラを追加して、ターゲットディスプレイ2にして、ゲームビュー追加してdisplay2を表示したらできた。

Windowsの設定でメインの解像度を100%にしないと1xにならない。

youtu.be

次回

音を付けたり、なんか雰囲気いい感じにしてストア登録したいお気持ち。

全体スクリプト

gist.github.com

【ARcore+Unity】マーカーありARをしようとした

 前回はタップしたらオブジェクトが出るサンプルをいじって、自分のモデルを出しました。

bibinbaleo.hatenablog.com

マーカーありのサンプルもあるので少し触ってみた。

サンプルシーン

AugumentedImageというサンプルシーンを使って、マーカーありARをする。

シーンの構成はこんな感じ

f:id:bibinbaleo:20190602192210p:plain

 

マーカーにしたい画像を右クリックCreate>GoogleARCore>Augumented~~

からデータセットができる。

f:id:bibinbaleo:20190602191811p:plain

それをARcoreDeviceのSessionConfigをクリック>AugumentedImageSettingConfigのDatasetにセット

f:id:bibinbaleo:20190602192212p:plain

f:id:bibinbaleo:20190602191809p:plain

これで実行すると、画像の4つの角に額縁みたいなのが付く。

f:id:bibinbaleo:20190602192215p:plain

任意のモデル出す

任意のモデルを出したいけど、このサンプルはなんか特殊みたいで簡単に変えられそうにない。

ExampleCobtrollerのAugumented~~をダブルクリックすると

f:id:bibinbaleo:20190602192722p:plain

こんなシーンが開く

f:id:bibinbaleo:20190602192729p:plain

ここにモデルはある。

雑に置いた。

f:id:bibinbaleo:20190602193821p:plain

出たけど真っ黒!ライト置いたのに。

f:id:bibinbaleo:20190602193818p:plain

っていうかなんで額縁は明るいんだろう。

スクリプト

自分でスクリプトを書かないといけないみたい。

jyukoさんの記事が参考になりそうです!
jyuko49.hatenablog.com

最後に

少し前に書いてたこの記事だけど、力尽きたのでここで終わります。

日本地図を使ったアプリを作りたい!!【Part3完成】アプリ閉じても情報保持

続き

bibinbaleo.hatenablog.com

今回で完成させるぞ!

完成したものがこちらです。

play.google.com

後ろのほうでうんこ実装してるけど気にしないでね。自分用メモ!!!!

プライバシーポリシー

最近GoogleStoreに出す際、内容問わずプライバシーポリシーを記載していないとストアから消されてしまうそうです。

bibinbaleo.hatenablog.com

 

前はリンクを貼りましたが、今回はアプリ内に表示させます。

f:id:bibinbaleo:20190607215051p:plain

 iボタンと×ボタンはペイント3Dで自分で作ることにします。

f:id:bibinbaleo:20190609141424p:plain

白くて見えないと思うけど下にあるので使っていいよ

×

f:id:bibinbaleo:20190609141435p:plain

i

f:id:bibinbaleo:20190609141437p:plain

アプリを閉じても情報保持(PlayerPrefs)

アプリがいったん終了すると、選んだ県の情報も消えてしまうので保持するようにする。

どうやるんだろう~そんなのやったことないな。

korechipostit.hatenablog.com

xml

teratail.com

PlayerPrefsというのを使えばいいらしい

www.sejuku.net

とりあえず勉強のため、ボタンを押した数を保存するものを作ってみた。

ボタンを押したらその回数が保存されるもの。右下の幅広いiがセーブボタンね。

f:id:bibinbaleo:20190609145836p:plain

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class plyerpfa : MonoBehaviour
{
    private int Press = 0;
    public Text text;
    void Start()
    {

       Press = PlayerPrefs.GetInt("PRESS",0);
        text.text = Press.ToString();
    }

    

    public void onPress()
    {
        Press++;
        text.text = Press.ToString();
        Debug.Log(Press);
    }

    public void OnSave()
    {
        PlayerPrefs.SetInt("PRESS", Press);
        PlayerPrefs.Save();
        Debug.Log(Press);
    }

}

 

ゲームが終わるとき

PlayerPrefs.Save (); でセーブされるらしい。

アプリが落ちたら呼ばれる関数あるのかな?

ないならセーブボタン作らないといけない?

調べたらゲームが終わるときに呼ばれるものがあった。

docs.unity3d.com

Editorで動かせばちゃんと動く。

でもちゃんとAndroidだとApplication-Quitを呼んで閉じないと呼ばれないっぽい。

docs.unity3d.compafu-of-duck.hatenablog.com

実際にApplication-Quitを呼ばずにホーム画面戻ってアプリタスク消去で試してみたけど、セーブされなかった。

つまりセーブボタンもしくはアプリ終了ボタンのどちらかは要るみたい。

終了ボタンなんて誰も押さないだろうからセーブボタン作った。

できた!!!!

f:id:bibinbaleo:20190609162542p:plain

消す 

セーブされたデータはメニューから消せるって。

qiita.com

Edit>Clear All PlayerPrefs

やったら消えた!!

実装

とりあえずPlaterPrefsの使い方はわかったところでアプリに組み込む。

フラグ

保持したい情報って、フラグ情報なんだけど、どうすればいいのかな
public void onButton()
{
btnChangeFlag = !btnChangeFlag;
image.color= btnChangeFlag ? btnColor1 : btnColor2;
}
}

 

playerPrefsにはboolを保持する仕組みはなさそう。

かといってboolをintにキャストすることもできないらしい

social.msdn.microsoft.com

boolじゃなくてintでフラグの代わりするか

        if (flg == 0)
        {
            image.color = btnColor2;
            flg = 1;
        }

        else if (flg == 1)
        {
            image.color = btnColor1;
            flg = 0;
        }

これでよい。

あと試してて気づいたけど、start()が呼ばれるときにsaveしてたものをもとに色を変えないといけないんだね。

 void Start()
    {       
       flg = PlayerPrefs.GetInt("TPRESS"+ this.gameObject.name, 0);

        if (flg == 0)
        {
            image.color = btnColor1;  
        }

        else if (flg == 1)
        {
            image.color = btnColor2;
        }
    }

ボタンそれぞれに違う変数

intをフラグの代わりにするのはできたけど、保存するPlayerPrefsの変数の名前が一緒だとすべてが0か1になってしまう。

ボタンを押して色が変わるスクリプトは1種類ですべてのボタンにつけている。

ボタンの名前を変数にいれたらできるかな。

PlayerPrefsの変数に変数?をいれることはできるみたい。

teratail.com

こんなかんじ

flg = PlayerPrefs.GetInt("TPRESS"+ this.gameObject.name, 0);

じゃあ自分のオブジェクトボタンの名前を取ってそれを変数に組み込めばいいなって思ったら・・・

ボタンの名前全部一緒だったーーーーー

ボタンの上のimageの名前はコピペしたら(1)(2)・・・って自動でつくから名前変わるけど、子オブジェクトのbuttonは全部button1っていう名前だった。

 

imageの名前を取ってくる方法もあるのかもしれないけど、ググるのがめんどくさいので47個のボタンの名前をひとつづつ変えることにした(アホ)

f:id:bibinbaleo:20190609162909p:plain

趣味で作ってる時ぐらい効率化とか考えたくない!!!

 

できた!!!!!

ちゃんと保存された!!!Androidでもちゃんと動いた!!!

終わり!

save

ちなみに保存は、都道府県を押したときにするようにしたのでsaveボタン要らないね。

でもあったほう使う人は安心するかな?

いや使う人いないからいいか・・・

一応作った。

f:id:bibinbaleo:20190609170613p:plain

ついでにデザイン変えた。

f:id:bibinbaleo:20190609170629p:plain

 

スマホ用アイコンの大きさって難しいな・・・

ボタンのハイライトって、別のボタン押したら消えるんだね。

GooglePlayConsole

登録しました。

めんどくさいけど1時間もあればできる。

bibinbaleo.hatenablog.com

翌日リジェクトされた。

f:id:bibinbaleo:20190610213004p:plain

一応対象年齢をちょっと変えてもう一度申請したけど、いつ通るかわからないから、もうこの記事公開しちゃう 

bibinbaleo.hatenablog.com

 

公開されました。

play.google.com

最後に

  今回はPlayerptrfsというものを使いました!圧倒的成長!!!!