Home –  Unity
Tag Archives: Unity

Unity上とビルドして実行すると結果が異なる事ってあるんですね_| ̄|○

UnityでMaterialの設定を操作する
を行ってUnityのIDE上で無事色が変わったの確認したのですが、ビルドしたら色が反映されませんでした( ;∀;)

using UnityEngine;
using System.Collections;

public class Test01 : MonoBehaviour {

    private Renderer renderer = null;

    // Use this for initialization
    void Start () {
        renderer = GetComponent<Renderer>();
        renderer.material.EnableKeyword("_EMISSION");
    }

    // Update is called once per frame
    void Update () {
        renderer.material.SetColor("_EmissionColor", new Color(0, 0, 1));
    }
}

こんなコードをSphereにくっつけてIDEで実行すると。

IDE上だと青い

ちゃんと青いのですが・・・・・これをビルドして実行すると

色がつかない

  • なんでじゃーーーーーーー *

ということで解決方法がわからず途方にくれています

UnityでMaterialの設定を操作する

備忘録的に(;´∀`)

実行中にMaterialのシェーダーの設定弄りたい時ありますよね。。。
Emissionとか。

どーするのかわからなくてどこかでググったんですが、参照元わからなくなってしまいましたが・・・

targetRenderer = target.GetComponent<Renderer>();
targetRenderer.material.EnableKeyword("_EMISSION");

targetRenderer.material.SetColor("_EmissionColor", new Color(0, 0, 1));

こんな感じでできました。特に二行目がキモだった気がします(;´∀`)
そのうち詳しいページ調べてちゃんと覚えなくては。

OneStepEffectsを使ってみる

OneStepEffects

こんなに見せられたら試してみるしかない・・・!
そして・・・・

Before

After

ぎゃぁぁぁ、コワイ。ホラーだ(;´∀`)
やっぱりこういうのはちゃんと設定しないとダメなんでしょうね。。。_| ̄|○

そんなわけで、テキトーに触っていたらなんとかそれらしい感じに(;´∀`)

  • Directional LightのLightコンポーネントの属性Intensityを0.8ぐらいまで増やす
  • Main CameraのObscuranceコンポーネントの属性Ambient Onlyにチェックを入れる
  • めっちゃ光りすぎるようになるので、Main CameraのBloomコンポーネントをよしなにいじる(;´∀`) Thresholdとか・・・・

Bloomも効いて少しはマシな感じになったのではないでしょうか(;´∀`)?
正直なところ、OneStepEffects使って理解したのは結局ちゃんと綺麗にしたければ知識をある程度得ないとダメだ。
というところです。OneStepで出来るのは知識もってるからOneStepで出来るんでしょうね。

今回の使用物

  • ニコニ立体ちゃん
    http://3d.nicovideo.jp/alicia/
  • Destroyed City Free
    https://www.assetstore.unity3d.com/jp/#!/content/6459
  • Unityちゃん
    http://unity-chan.com/

毎度、Assetを公開されている方々はホント感謝です。

iTweenとTerrain

とりあえず、キャラを動かして剣振ったり・・・

Unity勉強していてカメラが追従するようになったので、キャラクターをコントローラで操作出来るようにしていました。
とりあえず、Fog設定するだけでも見栄えがいいよーとか見たりして試してみたり。

Fogしてみたヽ(=´▽`=)ノ

んで iTween

キャラクタ操作関連はなんとなく、ある程度やってみたので次のステップとして「キャラクタを自動で動かす」ということをしようとしまして。
そしたらiTweenとしりました。

使い方は色々なところで書いてあるので割愛します。
ただiTweenを使うにあたって一つだけハマったところがありました(;・∀・)

それはiTweenとiTween Visual Editor両方ともインポートしたら各所でエラーが出てうまく動作が出来ないというところです(;・∀・)

Visual Editorを使う場合は「iTween Visual Editor」だけインポートすればいいみたいですね_| ̄|○

iTween と Terrain

ここからが本題ですが、キャラクタをiTweenでTerrain上を歩かせるということをしたかったのです。
しかしiTweenはRigidbodyの影響を受けないのか、重力を受けて落ちることもないですしColiderの影響を受けてぶつかるということもなさそうです。

Terrainの複雑な地形にそって歩かせる方法はあるのか・・・・!?
困ってiTweenのサンプルまでAssetStoreで買う始末(;・∀・)

UnevenTerrainサンプルを見てやり方をしりました。RaycastHitを使うんですねヽ(=´▽`=)ノ
サンプルは有料でしたし、実際のソースをここに書くのは良くないなぁと思い書きませんが、下記の動画のように動かすことができました。

なお、Terrainの地形はDestroyed City FREEを使っています。

yukari walk

キャラクタはユニティちゃんや結月ゆかりを使わせて頂いております
* http://unity-chan.com/
* http://www.vocalomakets.com/mmd.html

キャラクタ追従するカメラの話

Unity難しいですよねぇ。。。
キャラクタを出して、コントロールパッドで前後左右に動かすだけでも四苦八苦です。

とりあえず、なんとなくキャラクタが移動したものの視点が追従しないのです(;・∀・)
そりゃそうですよねということで、カメラをなんとか追従して動かしたく・・・。

勉強に使った「Unity5 3D/2Dゲーム開発 実践入門 -作りながら覚えるスマートフォンゲーム制作-」にキャラクタに
追従するカメラについての記載があったぞ・・・!
と思ったものの、カメラの方向は固定だった(;・∀・)

残念ながらこれだと、カメラの向きが固定だった。そうじゃないんだと試行錯誤したのです。

特に困ったのは
* カメラはキャラクタより高い位置にある
* キャラがバックした場合、カメラが下る事
* 常にキャラ方向(ただし、ちょっとキャラより遠くを見てる感じ)にする

カメラはキャラクタより高い位置にある

なんかよくわかってないけど、カメラをキャラクタより高い位置においたら、
キャラクタを追従して動かすときになんとなく変な挙動になった気がします。
(よーわかってないんですが(;・∀・))

色々考えたら、位置自体は上から見た平面で考えればいいので、yの値を追従するオブジェクトと
合わせて計算しました。

var current = new Vector3 (
    transform.position.x,
    target.transform.position.y,
    transform.position.z
);

キャラがバックした場合、カメラが下る事

カメラの到達位置をVector3.MoveTowards関数で位置計算してたんですが、
カメラのポジションをそのまま使うとカメラ位置から後ろに行かず・・・

ということで、チェック用に後ろに位置をずらした値を加える感じにしました。

current + Vector3.Normalize(current - target.transform.position) * distance

常にキャラ方向(ただし、ちょっとキャラより遠くを見てる感じ)にする

これが一番悩みの種でした。
単純に「transform.LookAt」だとターゲット方面にしか向かず、ちょっと遠くに向かせることが出来ません。
また、LookAtした後に、

transform.rotation = transform.rotation * Quaternion.Euler(new Vector3(-15, 0, 0));

したものの、ガクガクと画面が視点が上下に何故か揺れて・・・。
まあ、カメラの角度を固定する必要があるということで。

どこで見たのか覚えてないのですが下記のようにすることで解決しました。

var newRotation = Quaternion.LookRotation(target.transform.position - transform.position).eulerAngles;
newRotation.x = cameraAngle;
newRotation.z = 0;
transform.rotation = Quaternion.Euler(newRotation);

そんなわけで最終的には

こんな感じにつくりました。
ド素人なのでこれでいいのかなぁ。悩みはつきません。誰か助けて!っていう気持ちです。。。

using UnityEngine;
using System.Collections;

public class SimpleFollow : MonoBehaviour {

    private float distance;
    private float cameraHeight;
    private float yRotate;

    public GameObject target;
    public float followSpeed = 5;
    public int cameraAngle = 20;


    // Use this for initialization
    void Start () {
        //平面(X,Z)での距離を取得
        distance = Vector3.Distance(
            new Vector3(target.transform.position.x, 0, target.transform.position.z),
            new Vector3(transform.position.x, 0, transform.position.z));

        //カメラの高さの差分を取得
        cameraHeight = transform.position.y - target.transform.position.y;
    }

    void LateUpdate () {
        //カメラの位置を高さだけ、ターゲットに合わせて作成
        var current = new Vector3 (
            transform.position.x,
            target.transform.position.y,
            transform.position.z
        );

        //チェック用の位置情報を作成(バックした時にカメラが引けるようにdistance分位置を後ろにずらす)
        var checkCurrent = current + Vector3.Normalize(current - target.transform.position) * distance;

        //カメラが到達すべきポイントを計算(もともとのターゲットとの差分から計算します)
        var v = Vector3.MoveTowards (
            target.transform.position,
            checkCurrent,
            distance);

        //カメラ位置移動(位置計算後にカメラの高さを修正)
        transform.position = Vector3.Lerp(
            current,
            v,
            Time.deltaTime * followSpeed
        ) + new Vector3(0, cameraHeight, 0);

        //カメラの角度を調整
        var newRotation = Quaternion.LookRotation(target.transform.position - transform.position).eulerAngles;
        newRotation.x = cameraAngle;
        newRotation.z = 0;
        transform.rotation = Quaternion.Euler(newRotation);
    }

}