【Unity】TextMeshでオブジェクトを透過させない方法
unityのメモ帳的なブログにしようと思ってたのに、脱線した話ばかり記事にしてたので今回は、まじめに書きましょーね。
はい。
今回はTextMeshを使用する際の話。
TextMeshは空のGameObjectとかにAddして、表示したいテキストを入力して表示できる。
例えば、3Dモデルにスクリプトから生成した文字を、3Dモデルの表面に突っ込みたい!ってときには便利。文字が変わる場合、テクスチャをいじるのはかなり面倒だしね。
で、ここから困ったことに
TextMeshはモデルを貫通して見える。
は!?っざけんな!
ってなりますが、これの原因はUnityのビルドインシェーダーのせい。
でも、同じような実装するにはプロジェクターを使う方法ぐらいしかない。(これも違う記事で書く)この方法は個人的に気持ち悪い。
ってことで、シェーダー書きましょうね~
といっても、unityのシェーダーを丸パクリするので簡単簡単。
では早速、unityのダウンロードページから、使用してるunityのバージョン見つけてください。(僕は5.3.4)ダウンロードするのはビルドインシェーダー。
ダウンロードしたら、解凍して「Font.shader」ってのをmonoDevelopとかで開いてください。
開いたら、1行目と最終行以外をコピーしてね。(必要なのは中身だけなので)
で、unityのプロジェクトで新しいシェーダーとマテリアルを作ってください。
作ったら、新しいシェーダーを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 OneMinusSrcAlphaPass {
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
変更したらセーブしてね。
次に、さっき作ったマテリアルにシェーダーをつける。
このマテリアルをTextMeshオブジェクトのMeshRendererのMaterialsへ
あとは、作ったシェーダーのTextureの部分に表示したいフォントのfontTextureをいれるだけ。
すると、見えなくなる。
シェーダーの中身はunityC#と少し違うテイストなので、読み解くのがつらい。
ただ、いじり始めると楽しいかも。
Mikulus使ってみた
一部のTwitter垢で流行っているMikulusっていうのが気になったので、せっかくOculusもあるし、使ってみることにした。
久しぶりに触るOculus。
Mikulusはまだテスト段階らしいので、公式にリリースされていませんでした。
使用してみたい方はMikulusの公式TwitterにDM凸してみよう。
登録が完了すると、使用できるようです。
で、使ってみたよ。
もうね。すんごい。
ミクさんマジ天使。
デスクトップを全体的に見ることができるが、画質は荒かった。ただ、ズームで見れるため、さほど問題ない。
欲を言えばこのズーム画面をもう少し大きい範囲にしてほしいかなぁ。
他にもスクショを撮れたり、画面の切り替えができたり、VR空間にいながらいろいろなアクションができて楽しい。
ストーカーの部屋みたいで、次第に罪悪感がわいてくるが、、、
またこれつけたら戻ってこれないかも。。。
PSVRのサマーレッスンもこんな感じなのかなぁ・・・
もう少し、キャラクターとのアクション(フラグ)が起こせれば面白い。
以上、本日のヲタクでした。
【Unity】TweenAnimationについて -その1 Tweenとは-
昨日、久々に東方紅魔郷をプレイしました。
やっぱりBGMが神かがってますね。
それはさておき
昨日は、ブログ書いてないので、unityでなんかつくるときに重要なTweenについて書こうと思う。
Tweenってなんぞね?っていう人には「とりあえずググれカス」と言いたいところだけど、ググってもツイッターのクライアントしかでてこないので、簡単に説明します。
Tweenって?
簡単に説明すると今回(僕の)場合、Tweenとは「ツイッターのクライアント」「アニメーションさせるプログラム」の事をさします。
AssetStoreでTweenと検索すればわかるが、
iTween、Gokit、HOTween、LeanTween、、、
などなど、様々なTweenのAssetがStoreにゴロゴロ転がってる。(しかも無料)
こいつらめっちゃ便利なんです。
使い方
例えば、「だんだんオブジェクトを早くする」「だんだん大きくさせる」と、いったような「だんだん~する」みたいな実装をする際に用いる。
例、「だんだん透過させる」
※ポリゴンショックに注意
「だんだん~させる」には、素でコードを書くと、えらくめんどくさい。
それがこのTweenAssetを使えば2、3行で実装できてしまう。
使い方はAssetによって変わるので注意が必要。
ちなみに僕が使ったことあるAssetはGokitとLeanTween。
今回はLeanTweenを使って実装した。
今回はこの辺で
そのうち細かく噛み砕いて書いてく。
AdamくんがPPAPを踊ってくれました。
先日、AdamのAssetが公開されたので、ダウンロードしてみました。
で、Adam君に例のアニメーションをつけてみました。
素材はくまじゃなくてぐるくん (@gurukun237) | Twitterさんのtoggeterから
(これライセンス大丈夫かなぁ?)
【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さん。