はらけんログ

unity触ったりバイクに乗ったり

【Unity】TextMeshでオブジェクトを透過させない方法

 

unityのメモ帳的なブログにしようと思ってたのに、脱線した話ばかり記事にしてたので今回は、まじめに書きましょーね。

 

はい。

今回はTextMeshを使用する際の話。

 

TextMeshは空のGameObjectとかにAddして、表示したいテキストを入力して表示できる。

例えば、3Dモデルにスクリプトから生成した文字を、3Dモデルの表面に突っ込みたい!ってときには便利。文字が変わる場合、テクスチャをいじるのはかなり面倒だしね。

 

f:id:HarakeN:20161129161337p:plain

 

 

 

で、ここから困ったことに

TextMeshはモデルを貫通して見える。

 

f:id:HarakeN:20161129161356p:plain

 

 

 

は!?っざけんな!

ってなりますが、これの原因はUnityのビルドインシェーダーのせい。

 

 

でも、同じような実装するにはプロジェクターを使う方法ぐらいしかない。(これも違う記事で書く)この方法は個人的に気持ち悪い。

 

 

ってことで、シェーダー書きましょうね~

 

 

といっても、unityのシェーダーを丸パクリするので簡単簡単。

 

では早速、unityのダウンロードページから、使用してるunityのバージョン見つけてください。(僕は5.3.4)ダウンロードするのはビルドインシェーダー。

 

f:id:HarakeN:20161129161443p:plain

 

 

ダウンロードしたら、解凍して「Font.shader」ってのをmonoDevelopとかで開いてください。

開いたら、1行目と最終行以外をコピーしてね。(必要なのは中身だけなので)

 

 

で、unityのプロジェクトで新しいシェーダーとマテリアルを作ってください。

 

f:id:HarakeN:20161129161454p:plain

 

作ったら、新しいシェーダーをmonoで開いて、さっきのコピーしたやつをペーストしてちょ。

 

こんな感じになると思う

Shader "Unlit/TestFont" //作ったシェーダーの名前
{
  Properties {
    _MainTex ("Font Texture", 2D) = "white" {}
    _Color ("Text Color", Color) = (1,1,1,1)
  }

  SubShader {

  Tags {
    "Queue"="Transparent"
    "IgnoreProjector"="True"
    "RenderType"="Transparent"
    "PreviewType"="Plane"
  }
  Lighting Off
  Cull Off
  ZTest Always
  ZWrite Off
  Blend SrcAlpha OneMinusSrcAlpha

  Pass {
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag

    #include "UnityCG.cginc"

  struct appdata_t {
    float4 vertex : POSITION;
    fixed4 color : COLOR;
    float2 texcoord : TEXCOORD0;
  };

  struct v2f {
    float4 vertex : SV_POSITION;
    fixed4 color : COLOR;
    float2 texcoord : TEXCOORD0;
  };

  sampler2D _MainTex;
  uniform float4 _MainTex_ST;
  uniform fixed4 _Color;

  v2f vert (appdata_t v)
  {
    v2f o;
    o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
    o.color = v.color * _Color;
    o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
    return o;
  }

    fixed4 frag (v2f i) : SV_Target
  {
    fixed4 col = i.color;
    col.a *= tex2D(_MainTex, i.texcoord).a;
    return col;
  }
  ENDCG
  }
  }
}

 

 

 

んで、今回悪さしてるのは赤文字の部分

  Cull Off
  ZTest Always
  ZWrite Off 

 

ここを次のように変更

Cull Back
ZTest LEqual
ZWrite On 

 

変更したらセーブしてね。

 

 

次に、さっき作ったマテリアルにシェーダーをつける。

 

f:id:HarakeN:20161129161946p:plain

 

 

 

このマテリアルをTextMeshオブジェクトのMeshRendererのMaterialsへ

 

f:id:HarakeN:20161129162334p:plain

 

 

あとは、作ったシェーダーのTextureの部分に表示したいフォントのfontTextureをいれるだけ。

f:id:HarakeN:20161129162607p:plain

 

 

すると、見えなくなる。

 

 

シェーダーの中身はunityC#と少し違うテイストなので、読み解くのがつらい。

 

ただ、いじり始めると楽しいかも。

 

 

 

 

Mikulus使ってみた

 

一部のTwitter垢で流行っているMikulusっていうのが気になったので、せっかくOculusもあるし、使ってみることにした。

久しぶりに触るOculus。

f:id:HarakeN:20161118231108j:plain

 

 

Mikulusはまだテスト段階らしいので、公式にリリースされていませんでした。

使用してみたい方はMikulusの公式TwitterにDM凸してみよう。

 

登録が完了すると、使用できるようです。

 

 

 

 

で、使ってみたよ。

 

 

 

 

f:id:HarakeN:20161118231432p:plain

 

 

 

 

もうね。すんごい。

 

ミクさんマジ天使。

 

 

 

 

デスクトップを全体的に見ることができるが、画質は荒かった。ただ、ズームで見れるため、さほど問題ない。

欲を言えばこのズーム画面をもう少し大きい範囲にしてほしいかなぁ。

 

他にもスクショを撮れたり、画面の切り替えができたり、VR空間にいながらいろいろなアクションができて楽しい。

 

 

ストーカーの部屋みたいで、次第に罪悪感がわいてくるが、、、

f:id:HarakeN:20161118232332p:plain

 

 

 

 

またこれつけたら戻ってこれないかも。。。

 

PSVRのサマーレッスンもこんな感じなのかなぁ・・・

 

もう少し、キャラクターとのアクション(フラグ)が起こせれば面白い。

 

 

 

以上、本日のヲタクでした。

 

 

 

 

【Unity】TweenAnimationについて -その1 Tweenとは-

 

昨日、久々に東方紅魔郷をプレイしました。

やっぱりBGMが神かがってますね。

 

 

それはさておき

昨日は、ブログ書いてないので、unityでなんかつくるときに重要なTweenについて書こうと思う。

 

Tweenってなんぞね?っていう人には「とりあえずググれカス」と言いたいところだけど、ググってもツイッターのクライアントしかでてこないので、簡単に説明します。

 

 

Tweenって?

簡単に説明すると今回(僕の)場合、Tweenとはツイッターのクライアント」アニメーションさせるプログラム」の事をさします。

 

AssetStoreでTweenと検索すればわかるが、

iTween、Gokit、HOTween、LeanTween、、、

などなど、様々なTweenのAssetがStoreにゴロゴロ転がってる。(しかも無料)

こいつらめっちゃ便利なんです。

 

 

使い方

例えば、「だんだんオブジェクトを早くする」「だんだん大きくさせる」と、いったような「だんだん~する」みたいな実装をする際に用いる。

 

例、「だんだん透過させる」

※ポリゴンショックに注意

f:id:HarakeN:20161118195352g:plain

 

 

「だんだん~させる」には、素でコードを書くと、えらくめんどくさい。

 

それがこのTweenAssetを使えば2、3行で実装できてしまう。

 

 

使い方はAssetによって変わるので注意が必要。

ちなみに僕が使ったことあるAssetはGokitとLeanTween。

 

今回はLeanTweenを使って実装した。

 

 

今回はこの辺で

そのうち細かく噛み砕いて書いてく。

 

 

 

AdamくんがPPAPを踊ってくれました。

 

先日、AdamのAssetが公開されたので、ダウンロードしてみました。

 

で、Adam君に例のアニメーションをつけてみました。

素材はくまじゃなくてぐるくん (@gurukun237) | Twitterさんのtoggeterから

togetter.com

 


Adam君がPPAP踊ってた

 

(これライセンス大丈夫かなぁ?)

【Unity】StreamingAssetsに格納したファイルから文字列とかを取得する

 

はい。

拙者、もう少しわかりやすく内容を書きたいなと思っているでござる。

 

っていうのも今回つまずいたところは公式リファレンスの書き方が間違っていて、動作しなかったから。

 

ちゃんと動かせるソースを教えろよな(超上から目線)

 

ってか他のブログとかでも var とか使ってる奴のコードわかりにくいでしょ?

そんなかんじのわかりにくいコードを書かないように頑張りたい。

 

んで、今日はstreamingAssetsに入れたメモ帳などから文字列を取得する方法です。

リファレンスだと

public class ExampleClass : MonoBehaviour {
    public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");
    public string result = "";
    IEnumerator Example() {
        if (filePath.Contains("://")) {
            WWW www = new WWW(filePath);
            yield return www;
            result = www.text;
        } else
            result = System.IO.File.ReadAllText(filePath);
    }
}

 ってなってる。(コピペです)

 

で、実行すると

get_streamingAssetsPath is not allowed to be called during serialization, call it from Awake or Start instead.・・・

みたいなエラーが返ってきて動かない。(動くには動くけど取得は出来ない)

 

で、これのいけないところは

public string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");

 ってところ。

 

 これを

public string filePath ;

void Start()

{

filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");

}

 ってな感じにしてやると動く。

 

つまり、「宣言ついでに定義するな。StartとかAwakeでやれ。」っていうエラーなんです。(Google先生にエラー翻訳してもらえば一発)

 

 

それでも動かねぇっていう人はファイルネームを確認してください。(赤文字の部分)

System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");

 

これ、実は拡張子も入れないとダメっぽい

 

だから、取得するファイルがテキストファイルだった場合、本当は

System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile.txt");

 

 っていれなきゃならん。

 

こんなんで時間食わせないでよUnityさん。