「Cinema4D入門」に書いているような気もしますが、無限遠ライトの影を「エリア」にした場合、距離に応じてボケさせるには、ライトの属性マネージャの「詳細」パラメータグループを開いて、「無限遠の角度」を大きい値にします。初期設定値は0.5°みたいです。
3°で十分な感じです。
「Cinema4D入門」に書いているような気もしますが、無限遠ライトの影を「エリア」にした場合、距離に応じてボケさせるには、ライトの属性マネージャの「詳細」パラメータグループを開いて、「無限遠の角度」を大きい値にします。初期設定値は0.5°みたいです。
3°で十分な感じです。
Unityでいい感じに設定したディレクショナルライトの角度がX=50,Y=215,Z=0だったとして、
Cinema4D側で同じ向きに向けるには、H=-215,P=-50,B=0だっつーことがわかりました。
ゲームの舞台をCinema4Dで作り直しています。Unityはオブジェクトのインポートは充実しているけど、エクスポートは出来ない?形式はFBXでもOBJでも少なくて結構なんだけど・・・
仕方なく、一個一個のオブジェクトのサイズをインスペクターで調べて、ちまちま作り直しました。
unityのwebPlayer形式で書き出すと、影がレンダリングされなくなる(描画を軽くするため?)ので、影をテクスチャで描くかベイクするかと考えています。影の使わない場合、DrawCallsが一気に減ります。
前回、ヘルプ画面をunityのOnGUIを使っていたのをNGUIで作り直そうとしていたわけですが、OnGUIでやる場合、現在のシーンの他にヘルプ画面用のシーンを用意しておいて、
Application.LoadLevelAdditive("guide_01");
なんて感じで、呼び出していたんです。LoadLevelAdditiveを使うと、すると現在のシーンに呼び出したシーンが融合されます。同じことを、NGUIを使って行うと、NGUIのUIの階層構造(UIRoot(2D)以下)がもう一つ読み込まれて、合計2つになってしまって、おかしなことになってしまいました。(前後関係の設定が正しく出来なかった?)
そんで、どうやって解決するのかと考えていたんだけど、「別にもう一つのシーンを読み込む必要ないんじゃね?」ということに気づき、現在のシーンのNGUIのUIにヘルプ画面と、元の画面に戻るための「もどる」ボタンを用意して、必要に応じて表示することにしました。そして実際にこれはうまく行くように見えました。しかし、新たな問題が発生しました。それは非アクティブにしているボタンをGameObject.Findで探すことができないということでした(つまりSetActive(true);ができない)。そして、このことを回避するために、ボタンのコライダとボタンの画像のUIスクリプトのenabledをスクリプトでtrue,falseでコントロールしてみました。ちょっとスマートじゃないような気がしましたが、これでほぼうまく行きました。しかしちょっとボタンの挙動がおかしいかったけど。
この問題を回避するためにいろいろ調べ回った結果、解決策は、最初はボタンを表示しておいて、そのボタンを変数に格納し、その後すぐ隠してしまうということでした。
スクリプトは下のようになりました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;
public class Stage01Help : MonoBehaviour {
private GameObject BackButton;
void Awake(){
//最初から非アクティブ化しておくとGameObject.Findで探せないので、
//最初は表示しておいて、変数に格納した後に非アクティブ化して隠す
BackButton = GameObject.Find("ButtonBackToStage01");
BackButton.SetActive(false);
}
public void HelpButtonClick() {
Debug.Log("Help Button is Pushed!");
//ザ・ワールド!時よ止まれ!
Time.timeScale = 0;
//ターゲットカメラのオーディオソースを止める(Stage01のBGMを止める)
GameObject.Find ("TargetCamera").GetComponent<AudioSource>().enabled = false;
//自動車のエンジン音を止める
GameObject.Find ("Car").GetComponent<AudioSource>().enabled = false;
//Helpのオーディオソースを鳴らす
GameObject.Find ("Help").GetComponent<AudioSource>().enabled = true;
//ヘルプのテクスチャを表示する
GameObject.Find("Sprite (Stage1_Playguide)").GetComponent<UISprite>().enabled = true;
//Help画面のもどるボタンを表示する
BackButton.SetActive(true);
}
public void BackToStage01ButtonClick(){
//時は動きだす!
Time.timeScale = 1;
//ターゲットカメラのオーディオソースを元に戻す
GameObject.Find ("TargetCamera").GetComponent<AudioSource>().enabled = true;
//自動車のエンジン音を元に戻す
GameObject.Find ("Car").GetComponent<AudioSource>().enabled = true;
//Helpのオーディオソースを止める
GameObject.Find ("Help").GetComponent<AudioSource>().enabled = false;
//ヘルプのテクスチャを隠す
GameObject.Find("Sprite (Stage1_Playguide)").GetComponent<UISprite>().enabled = false;
//Help画面のもどるボタンを隠す
BackButton.SetActive(false);
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
というかんじ。な… 何を言ってるのか わからねーと思うが
おれもよくかわからない…
Time.timeScale = 0;というのがあって、これのおかげで、ヘルプ画面の表示中はスタートからの時間を計っている時計も止まります。
そういうわけで、NGUI2.7を使ってGUIを刷新できました。日本語フォントはOsakaフォントをなぞって切り文字風にしました。
次は最初に開くスタートメニューの画面もNGUIで作り直す予定。
難易度の表示は、下記のようなスクリプトを「かんたんモード」、「ふつうモード」、「むずかしいモード」の画像を貼ったNGUIの各スプライトに適用し、ゲームのスタート画面で難易度を選択する時に指定されるグローバル変数(varHolderスクリプトのstatic変数difficulty)の持っている値(0が簡単、1がふつう、2がむずかしい)から、そのスプライト自体の表示/非表示を判断します。enabled = trueでそのコンポーネントにチェックが入り、enabled = falseでチェックが外されます。
「.」は「の」と考えるといいです。つまり○○市の△△町の・・・みたいな感じです。データの区切りです。
GetComponent<UISprite>().enabled = true;
と書かれていた場合、UISpriteという名前のスクリプトの使用可能(enable)かどうかを設定します。「true」なので「使う」です。こういう感じで3つのモードのどれかが表示されるようになってます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;
public class MenuModeSelectEasy : MonoBehaviour {
// Use this for initialization
void Awake () {
if(varHolder.difficulty == 0){
GetComponent<UISprite>().enabled = true;
}
else if(varHolder.difficulty == 1){
GetComponent<UISprite>().enabled = false;
}
else if(varHolder.difficulty == 2){
GetComponent<UISprite>().enabled = false;
}
}
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
そのVarHolderスクリプトというのは、下記な感じです。staticで宣言された変数はそのシーンが破棄されて、別のシーンが呼び出された時も存在し続けますので、新しく呼び出されたシーンからアクセス可能なンです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
using UnityEngine;
using System.Collections;
public class varHolder : MonoBehaviour {
//テクスチャ番号を保持するstatic変数:carTexture
public static int carTexture;
//難易度情報を保持するstatic変数:difficulty
public static int difficulty;
//その動作確認
// void Update(){
// Debug.Log("car Texture is "+ carTexture);
// Debug.Log("difficulty is "+ difficulty);
// }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
もはやCinema4Dメモとは言えなくなってきているけど、メモ。
NGUIの2.7が制限はあるけど無料で使っても良いということなので、既存のGUIから置き換えてみようと苦戦中です。
空のゲームオブジェクト(Helpという名前)を作って、それにStageChangeというスクリプトをくっつけています。
そのなかには、HelpButtonClick()という自分で作った関数があって、これは呼ばれると「Help Button is Pushed」という内容でDebug.Logをコンソールに出力します。
コンソールにDebug.Logが表示されてるので、ちゃんと動いているということが確認できたら、
Application.LoadLevelAdditive("guide_01"); の一行でDebug.Logの行を置き換えます。
↑は現在のシーンを破棄することなく、guide_01というシーンファイルを開きます(後で元のシーンに戻るので)。
NGUIで作ったボタンに付いている、UI Button Messageというスクリプトは、Component→NGUI→Interaction→Button Messageで呼び出します。
HELLモードとDEATHモードでは、アッパーデッキの最深部の通路の路肩部分が車両の接近を検知して崩落するという絶望的な演出を盛り込んでみました。HELLモードは片側、DEATHモードは両側が崩落します。かなり脱輪しまくりでいい感じDEATH。
スタートからの時間を測定するタイマーも実装しました。すべての燃料缶を集め終わると止まるという優れものです(笑)
うちの子供達に運転の楽しさとか安全運転の大切さを知ってもらうために開発を続けているこのゲームですが、大人には物足りないのも事実という訳で、より難しくするために、HELLモードとDEATHモードを実装することにしました。
DEATHモードはかなり厳しいゲームバランスになる予定です(笑)