凛(kagring)のUE4とUnityとQt勉強中ブログ

2016 年から UE4 を触り始めました。勉強したもののメモ用のブログです。C++ での Qt、Unity も少しあります。

2014年01月 | ARCHIVE-SELECT | 2014年03月

| PAGE-SELECT | NEXT

≫ EDIT

埋め込みフォントの表示

Unity で埋め込みフォントを使う方法です。
*.ttf などの TrueType フォントですね。

結構これは説明が複雑なのでこちらを見たほうが早いです。

・[Unity][Unity3d]GUIやテキスト表示で日本語を使う方法とフォント埋込みについて
http://d.hatena.ne.jp/nakamura001/20110615/1308153980

とりあえずPCではあまり問題にはならなさそうなのですが
容量が大きくなったりするのが問題みたいですね。

有料のフォントだとあまり埋め込みは許していないことが多いので
いまだと「M+」とかが使うとよい感じでしょうか。

容量などが気になるモバイルなどでは上記ページにもリンクがありますが
こちらを見るとよいかもしれません。
フォントも配布されているのでとても良いと思います。

・Selected U3D Japanese Font - 俺がぐったり部だ!
http://d.hatena.ne.jp/dearna/20110419/1303207066

というわけで無事フォントを表示することができました。
フォント
スポンサーサイト

| Unity | 03:23 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

フォグを使ってみる

3Dでよくあるフォグの機能ですね。

詳しい内容はテラシュールウェアさんに詳しく書いてあったので
そちらを見たほうがよさそうです!

・[Unity3D]Fogの機能を使ってみた
http://terasur.blog.fc2.com/blog-entry-190.html

というわけでフォグを適用してみた画面がこちら。
フォグ

奥の方が暗く(黒く)なるようにしてみました。
設定自体は簡単なのでうまく使えばいい感じになりそうです。

| Unity | 01:41 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

解像度に対応した OnGUI

Unity で解像度に依存しない OnGUI の処理です。
Screen のサイズをとってくれば大体はなんとかなるのですが
その場合サイズの変更をしようとすると結構めんどくさくなります。

そこで、既定の解像度を決めておいて、
スクリーンのサイズがそれ以上かそれ以下の場合、縮小や引き延ばして表示する方法です。

・Unity iPhone4 Retina ディスプレイ対応:GUI 部分
http://sehm.blog48.fc2.com/blog-entry-160.html

ここにあるように GUI.matrix の設定を行います。
そうすることで、解像度に対応したサイズに引き延ばしてくれます。

ただし、比率が異なる場合は、縦や横に伸びてしまうので注意してください。

| Unity | 21:39 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

テクスチャの UV スクロール

テクスチャの UV スクロールをする方法です。
調べてみたらどうもテクスチャが一枚のマテリアルであればこういう方法があるようです。

・テクスチャの擬似スクロールと小技
http://unity-study.net/archives/170

この方法だとちょっと汎用性に欠けたのでマテリアルからセットする方法を探してみました。
マテリアルからセットする方法があるようです。

ここの方法でマテリアルを取得して
そのマテリアルに対して「SetTextureOffset」関数でUVスクロールができるようです。

こんな感じですね。

// テクスチャUVスクロール
Material material = this.gameObject.renderer.material;
material.SetTextureOffset("_MainTex", new Vector2( 0.5f, 0.25f ) );


引数に Vector2 を渡すことでその分だけオフセットで動きます。
上記の例だと値が動いてないのでスクロールはしないので注意してください。

第一引数はそのマテリアルのシェーダーのテクスチャ変数名っぽいですね。
だいたいはデフォルトであれば「_MainTex」の指定で行けると思います。

ドキュメントはこちら。
・Material.SetTextureOffset
https://docs.unity3d.com/Documentation/ScriptReference/Material.SetTextureOffset.html

というわけで上記の処理をいれてみたのがこちら。


ちゃんとスクロールしているのではないでしょうか。

| Unity | 01:31 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

Skyshop で背景を非表示にする

Skyshop で生成した Sky オブジェクトがある場合、
背景に作ったキューブマップ?が表示されると思います。

これを消すには、Sky オブジェクトのインスペクターから設定できる
「Show Skybox」のチェックを外すことで非表示にすることができます。

Skyshop非表示

上記の場所ですね。

| Unity | 00:30 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

スクリーン座標の取得

ワールド座標をスクリーン座標に変換して座標を取得する処理です。

かなり簡単で、カメラには「WorldToScreenPoint」という関数があるのでそれを使うだけです。

・Camera.WorldToScreenPoint
http://docs-jp.unity3d.com/Documentation/ScriptReference/Camera.WorldToScreenPoint.html

ゲームオブジェクトの位置をスクリーン座標に変換するとしたらこんな感じになります。

// スクリーン座標取得
GameObject object = GameObject.Find("Object");
GameObject camera = GameObject.Find("Camera");
Vector3 screenPoint = camera.camera.WorldToScreenPoint(object.transform.position);


Unity はカメラなどにいろいろな機能が用意されてるので便利でいいですね。
スクリーン座標をワールド座標に変換する関数とかもありますし。

画面左下が(0, 0)になるので注意してください。

| Unity | 23:35 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

MiniJSON で Json ファイルを読み込む

LitJSON 以外になにかないかと思い探してみました。

・[Unity][MiniJSON]JSONデータを読み込む
http://www.cho-design-lab.com/2013/08/15/unity-minijson-load-json/

インストール方法からデコードの方法までのっているので無事できました。
これは Json のテーブルが複数ある場合の読み込みみたいですね。

単体の場合はこんな感じになるようです。

・UnityでJSONをあつかう - MiniJSON
http://neareal.net/index.php?ComputerGraphics%2FUnity%2FTips%2FJSON%2FMiniJSON

というわけで今回は無事 Json ファイルを読み込んでデータを取得することができました。

| Unity | 03:22 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

LitJSON で Json ファイルを読み込む

配置などのデータを読み込みたかったので
とりあえず Json ファイルを読み込んでみようと思いました。

調べたところ、LitJSON というライブラリ?があるようなので試してみました。

・UnityでJSONをあつかう - LitJSON
http://neareal.net/index.php?ComputerGraphics%2FUnity%2FTips%2FJSON%2FLitJSON

導入は上記のサイトをみてやりました。公式以外のほうはリンクがきれているようです。
ダウンロードしたファイルから cs ファイルだけプロジェクトに追加しました。

・UnityでJSONを扱う
http://d.hatena.ne.jp/shinobu_siv/20110325/1301057486

上記二つのサイトは「LitJson.JsonMapper」を使うようです。
構造体を用意してそこに当てはめていく方式ですね。

同じように記述したのにエラーが。謎です…。誰か教えてください (´;ω;`)


MissingMethodException: Method not found: 'Default constructor not found...ctor() of TaskScript+TestData[]'.
System.Activator.CreateInstance (System.Type type, Boolean nonPublic) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System/Activator.cs:368)


エラーの内容はこんな感じでした…なんでしょうか…。

・ResourcesLoadからJSONのデータ読み込みでハマる
http://d.hatena.ne.jp/shinriyo/20130124/p1

もう一つの方法は上記のサイトのように「JsonReader」を使う方法。
こちらは使ってみるとちゃんと受け取れてるようなのですが、ファイルの最後まで読み込むと


KeyNotFoundException: The given key was not present in the dictionary.
System.Collections.Generic.Dictionary`2[System.Int32,System.Int32[]].get_Item (Int32 key) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:150)


こんなエラーが。
というわけで LitJSON は断念しています…_no

・LitJSON
http://lbv.github.io/litjson/

ちなみに上記のサイトが公式みたいです。

| Unity | 22:31 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

Resources.Load

通常はシーン単位で読み込みを行うのですがファイル個別に読み込むこともできるようです。
それが「Resources.Load」命令です。

詳しくはこちらに。

・スクリプトからアセットを読み込む
http://neareal.net/index.php?ComputerGraphics/Unity/Tips/Script/DynamicAssetsLoading

プレファブをインスタンス化することもできるようです。

・Unity: Prefabをスクリプトからインスタンス化する
http://hamken100.blogspot.jp/2012/04/unity-prefab.html

後から読むものだったり、別タイミングで読むものとかは良いかもですね。

Resources.Load() のファイルパスは階層構造にも対応しているので
カテゴリ別や、種類別にフォルダを作成するとよいみたいですね。

| Unity | 01:23 | comments:0 | trackbacks:0 | TOP↑

≫ EDIT

Oculus で OnGUI を扱う

Oculus と通常のモードを切り替えて遊べるようなものを考えていて、
PC 専用で考えているので多少の重さは気にしないので OnGUI を使って 2D 関係を描画していました。

これが Oculus になるとどうもうまくいく方法が見当たらないので調べてみました。
結果、自分では見つけられなかったのですが、VRGUI というものを教えていただきました。

・Unity GUI Package + Example
https://developer.oculusvr.com/forums/viewtopic.php?f=37&t=4944
※ログインが必要です

中ぐらいに「VRGUI.zip」というリンクがあり、パッケージを落とすことができます。

これの使い方は簡単で、

// クラスを継承
public class ClassName : VRGUI {


こんな感じで「VRGUI」クラスを継承します。
「VRGUI」は「MonoBehaviour」を継承しているのであまり気にする必要はありません。

継承したものを作成したら「OnGUI」の代わりに
「OnVRGUI」という関数を作成します。この関数がないとエラーになります。
この「OnVRGUI」の中身は「OnGUI」と同じものでOKです。

// Oculus GUI 処理
public override void OnVRGUI()
{
// 描画
GUI.DrawTexture( new Rect(0,0,256,256),texture);
}


これで Oculus を使ったときにもちゃんと表示されるようになります。
こんな感じですね。
VRGUI000

注意点としては「OVRCameraController」をシーンに配置しないといけないのと
そのカメラの位置が反映されるので気をつけてください(多分初期状態だとアップになりすぎている)

さて、これで Oculus を使ったときにはちゃんと表示できたのですが
普通に遊ぶときは普通に OnGUI で表示したいところです。

クラスは継承しているのでそこをうまく制御すれば切り替えることができます。
ということでこんな感じに。

// Oculus GUI 処理
public override void OnVRGUI()
{
// 描画を実行
this.RenderGUI();
}

// GUI 処理
public new void OnGUI()
{
// オキュラスの場合
if(IsOculus()){

// ベースを呼ぶ
base.OnGUI();
}
// Oculus 以外
else{

// 描画を実行
this.RenderGUI();
}
}

// 描画関数(1クッション置くため用)
private void RenderGUI()
{
// 描画
GUI.DrawTexture( new Rect(0,0,256,256),texture);
}



と、こんな感じに書くことで通常と Oculus 描画を切り替えることができます。
C# の記述方法が間違っていたらすみません…。

判定部分をいつでも切り替えられるようにしておけばこんな感じになります。
VRGUI001 VRGUI000

一応うまく行ったのですが、ちょっと歪んだ平面みたいになっているのが気になるのですよね…。
色々調べてみようかと思います。

ちなみにこれマウスカーソルも Oculus に対応してるのは便利ですね。
マウスオペレーションができるのではないかと。

| Unity | 23:16 | comments:0 | trackbacks:0 | TOP↑

| PAGE-SELECT | NEXT