Cinema4Dメモ

Cinema4Dという3DCGソフトに関するメモ書きです。

無限遠ライトの影をエリアにした場合のボケ

2014-05-28 15:18:30 | Cinema4D設定、操作

「Cinema4D入門」に書いているような気もしますが、無限遠ライトの影を「エリア」にした場合、距離に応じてボケさせるには、ライトの属性マネージャの「詳細」パラメータグループを開いて、「無限遠の角度」を大きい値にします。初期設定値は0.5°みたいです。

3°で十分な感じです。


久々のモデリング

2014-05-27 13:54:23 | Unity&Cinema4D

ゲームの舞台をCinema4Dで作り直しています。Unityはオブジェクトのインポートは充実しているけど、エクスポートは出来ない?形式はFBXでもOBJでも少なくて結構なんだけど・・・

仕方なく、一個一個のオブジェクトのサイズをインスペクターで調べて、ちまちま作り直しました。

unityのwebPlayer形式で書き出すと、影がレンダリングされなくなる(描画を軽くするため?)ので、影をテクスチャで描くかベイクするかと考えています。影の使わない場合、DrawCallsが一気に減ります。


NGUI(2.7)でヘルプ画面等を作る場合

2014-05-21 19:46:36 | Unity&Cinema4D

前回、ヘルプ画面を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;というのがあって、これのおかげで、ヘルプ画面の表示中はスタートからの時間を計っている時計も止まります。


NGUIによるゲーム画面の日本語化

2014-05-15 13:44:18 | Unity&Cinema4D

そういうわけで、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);
//    }
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー



NGUI2.7でボタン

2014-05-14 12:34:02 | Unity&Cinema4D

もはや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で呼び出します。

 


難易度の演出

2014-05-09 21:06:54 | Unity&Cinema4D

HELLモードとDEATHモードでは、アッパーデッキの最深部の通路の路肩部分が車両の接近を検知して崩落するという絶望的な演出を盛り込んでみました。HELLモードは片側、DEATHモードは両側が崩落します。かなり脱輪しまくりでいい感じDEATH。

スタートからの時間を測定するタイマーも実装しました。すべての燃料缶を集め終わると止まるという優れものです(笑)


ゲームの難易度の実装

2014-05-02 10:03:38 | Unity&Cinema4D

うちの子供達に運転の楽しさとか安全運転の大切さを知ってもらうために開発を続けているこのゲームですが、大人には物足りないのも事実という訳で、より難しくするために、HELLモードとDEATHモードを実装することにしました。

DEATHモードはかなり厳しいゲームバランスになる予定です(笑)