Unity

2016年3月21日 (月)

Unityでカメラの方向に合わせて移動するプログラム

 デモンズソウル、ダークソウルシリーズ、はたまた別のアクションゲームでよく取り入れられている移動方法を作るプログラムです。

-これで出来ること
カメラの方向に合わせた移動ができます
-これでできないこと
ジャンプができません

 

20160321
動きとしては上の画像のような流れになります(図が雑なのはご容赦)。
カメラの回転座標を取得して、その方向を前とします。
そしてその数値をプレイヤーの移動量と掛け合わせてプレイヤーの移動とします。
-------------

-私の開発環境
 Unity5.3.1f
 Visual Studio 2013

-ソースコード

using UnityEngine;
using System.Collections;

public class MoveForPlayer : MonoBehaviour {
    /*参考文献:http://qiita.com/yando/items/c406690c9ad87ecfc8e5
     * StandardAsset ThirdPersonUserControl.cs
     */
    private Transform CamPos;
    private Vector3 Camforward;
    private Vector3 ido;
    private Vector3 Animdir = Vector3.zero;

    float runspeed = 0.2f;

    void Start()
    {
        if (Camera.main != null)
        {
            CamPos = Camera.main.transform;
        }
        else
        {
            Debug.LogWarning(
    "Warning: no main camera found. Third person character needs a Camera tagged \"MainCamera\", for camera-relative controls.");
        }
    }

    void Update()
    {

    }

    private void FixedUpdate()
    {
        //キーボード数値取得。プレイヤーの方向として扱う
        float h = Input.GetAxis("Horizontal");//横
        float v = Input.GetAxis("Vertical");//縦

        //カメラのTransformが取得されてれば実行
        if (CamPos != null)
        {
            //2つのベクトルの各成分の乗算(Vector3.Scale)。単位ベクトル化(.normalized)
            Camforward = Vector3.Scale(CamPos.forward, new Vector3(1, 0, 1)).normalized;
            //移動ベクトルをidoというトランスフォームに代入
            ido = v * Camforward * runspeed + h * CamPos.right * runspeed;
            //Debug.Log(ido);
        }

        //現在のポジションにidoのトランスフォームの数値を入れる
        transform.position = new Vector3(
        transform.position.x + ido.x,
        0,
        transform.position.z + ido.z);

        //方向転換用Transform

        Vector3 AnimDir = ido;
        AnimDir.y = 0;
        //方向転換
        if (AnimDir.sqrMagnitude > 0.001)
        {
            Vector3 newDir = Vector3.RotateTowards(transform.forward,AnimDir,5f*Time.deltaTime,0f);
            transform.rotation = Quaternion.LookRotation(newDir);
        }

    }

}
-------

-説明

    private Transform CamPos;
メインカメラポジション保存用トランスフォームです
    private Vector3 Camforward;
カメラの向いている方向保存用ベクターです
    private Vector3 ido;
プレイヤー移動用ベクターです
    private Vector3 Animdir = Vector3.zero;
プレイヤー方向転換用ベクターです(初期化オールゼロ)
    float runspeed = 0.2f;
プレイヤー移動量調整用フロートです

    void Start()
この関数内では、メインカメラの取得を行います。
Camera.main.transformでメインカメラのトランスフォームが取得できます。
もしメインカメラという名称が無ければ取得できず、nullを返しエラーを吐く仕組みです。

    void Update()

    private void FixedUpdate()
この関数内では、もしカメラポジションが取れていれば使える関数です。
この内部がこのスクリプトのミソになってます。
この部分だけでカメラの方向に合わせて移動することができます。

以下のUpdate関数内に入っているコードは方向転換させるためのスクリプトです。
一度XとZ座標を取得してから、それを活用して移動している方向に合わせてプレイヤーが回転し、移動している方向を向きます。

-最後に
また、このスクリプトはUnity StandardAsset FreeLookCameraRigというプレハブを活用しています。
これはスタンダードアセットのカメラから使えます。もしスタンダードアセットをDLしていない場合はDLしてください。(アセットに追加したら [Assets -> StandardAssets -> Cameras -> Prefabs -> FreeLookCameraRig] にあります)

プレイヤーには説明したスクリプトを。ヒエラルキーにFreeLookCameraRigを設置し、Free Look Cam.csのアバター選択をプレイヤーアバターに設置すればOKです。

| | コメント (0) | トラックバック (0)

2015年9月19日 (土)

jokerscript for Unityでのセーブデータ保管場所云々

2015y09m19d_202955098
 UnityのAssetでjokerscriptを使う時にセーブデータの保管場所を探して削除する方法です。

 UnityのjokerscriptはApplication.persistentDataPath + αの記述でセーブされています。
Application.persistentDataPathの保存パスは以下の通りです
C:/Users/ユーザー名/AppData/LocalLow/[DefaultCampany](CampanyName)/[プロジェクト名](ProductName)/
(確認はwindows機)

2015y09m19d_203352116
 このファイル内にある".sav"データを消せばセーブデータが消えます。

※注意点
 ひとつ注意が必要なのが[]で囲まれているDefaultcampanyです。これはUnity上での制作中、[Edit]->[ProjectSettings]->[Player]の内部にあるCampanyNameとProductNameに依存します。
2015y09m19d_202524735

 もし、この部分を弄っていなければ最初に示したDefaultCampanyフォルダが生成されますが、弄っているのならCampanyNameの名称でフォルダが生成されるので留意してください。
 ちなみに、日本語などの多バイト文字にはフォルダ生成が対応してないので多バイト文字は"_(アンダーバー)"になります。

--AppDataが見当たらない--
 AppDataは原則隠しフォルダになっているのでPCのコントロールパネルから変更をします。
Windowsでは[コントロールパネル]->[デスクトップのカスタマイズ]->[フォルダーオプション]で変更します。
フォルダーオプションのタブの[表示]->[ファイルとフォルダーの表示]->[隠しファイル、隠しフォルダー、および隠しドライブを表示する]のラジオボタンを選択したら適用を押せば出現するはずです。

| | コメント (0) | トラックバック (0)

2015年8月22日 (土)

Live2DのSampleApp1を用いて自前のキャラクターをクリックで反応させる

ーLive2DがUnity用のSDKを配布しています。その中のsampleに含まれるSampleApp1に自前のキャラクターを入れてクリックするとモーションを再生するようにします。

2015y08m22d_194958729

ここで一つ大きな壁として「当たり判定を持ったLive2Dキャラクター」を作成します。
今回、その作成法は参考URLだけで済ませてしまいます。もし、作っていない場合は以下のURLを参考に作成してください。
当たり判定の配置

作る際に大まかな問題点としては、

 当たり判定を持ったLive2Dモデルの作成

 json手書き

です。これをクリアすれば、他は言うほど大きな障害になりません。

----必要なもの--------------------------------------------------------

Unity5

オリジナルの(当たり判定を持った)Live2Dモデル

Live2D_SDK_Unity_2.0.09_1

---------------------------------------------------------------------------

SampleApp1を用いて表示、モーションを対応させる場合.jsonファイルがModelerでもViewerでも出力されない内容なので、元から入っているデータのjsonファイルを参考に手で構築していく必要があります。ここが一番大変なところであり、これが出来れば大方できたことになります。jsonファイルはメモ帳でも開けます。

これから作るjsonファイルは図にするとこんな感じになります。

Json

各々のツールで生成されるjsonデータ内部は

Modelerでは

type

name

model

texture

であり、

Viewerでは

version

model

texture

motions

(physis)

(pose)

(expressions)

etc...

です。

今回は、「クリックしてモーション再生」を行うので、物理演算のPhysisや腕の切り替えなどを行うpose、表情変化をさせるexpressionsなどは省きます。というかカッコ内のは作って出力したことがないので、Viewerから出力されないかもしれません。

これから作るjsonのデータは、

type

name

model

texture

layout

hit_areas

motions

  --idle

  --tap_body

となります。手打ち作業でjsonをやるので慣れてない人は時間がかかるかもしれないので、時間と飲み物を甘いものを用意してのんびり行ってください。あと、折れない心もあるといいです(私はこの記事を書くまでに3回挑戦して失敗してます)。SampleApp1に入ってるモデルのjsonを真似ながらそれっぽく作ればいいんですが、それを言ってはおしまいなので、拙いながらを解説を。

type,name,model,textureはModeler出力からmotionsをViewer出力から使います。

Viewer出力の際は、モーションとUnityとの関連付けの問題で、体をタップさせて再生したいモーションのタグを「tap_body」にしてください。方法はmocファイルをViewerで開き、motionsフォルダをドラッグ&ドロップでインポートした後に、モーションデータをクリックすれば「グループ名」というのが表示されるので、そこをtap_bodyにします。

2015y08m22d_194645837

この今、写っているキャラクターのjsonファイルはこうなりました

---------------------------------------------------------------------------------------

2015y08m22d_195425352

{
    "type":"Live2D Model Setting",
    "name":"totomi",
    "model":"totomi.moc",
    "textures": [
        "totomi.2048/texture_00.png"
    ],
    "layout":
    {
        "center_x":0,
        "y":1.2,
        "width":2.9
    },
    "hit_areas":
    [
        {"name":"head", "id":"D_REF.HEAD"},
        {"name":"body", "id":"D_REF.BODY"}
    ],
    "motions":{
        "idle":[
            {"file":"motions/totomi_idle.mtn","fade_in":2000,"fade_out":2000},
            {"file":"motions/totomi_idle_02.mtn","fade_in":2000,"fade_out":2000}
        ],
        "tap_body":[
            {"file":"motions/totomi_angry.mtn","fade_out":0},
            {"file":"motions/totomi_sleep.mtn","fade_out":0},
            {"file":"motions/totomi_sleep_up.mtn","fade_out":0},
            {"file":"motions/totomi_smile.mtn","fade_out":0},
            {"file":"motions/totomi_tameiki.mtn","fade_out":0},
            {"file":"motions/totomi_tere_01.mtn","fade_out":0},
            {"file":"motions/totomi_toboke.mtn","fade_out":0},
            {"file":"motions/totomi_unazuki.mtn","fade_out":0}
        ]
    }

}

----------------------------------------------------------------------------

上から順番に、type,name,model,textures,layout,hit_area,motionsです。以下各々の説明です。このjsonファイルを読み込んでUnity上で出力するのでこの内部のパス階層が違っていたり、名前が間違っているとエラーを吐きます。根気よく。

タイプ(type)はLive2D Model Settingです。

ネーム(name)は、このモデルの名前です。

モデル(model)は、mocファイルの名前です。

テクスチャ(textures)は、テクスチャが入っているフォルダ/名前です。

レイアウト(layout)は、表示位置と幅の指定です。同じ数値でも、Unityの方で位置を弄ればいいので同じ数値でも問題ないかも。

ヒットエリア(hit_areas)は、ヒットエリアの名称、idを各々指定します。

モーション(motions)は、何もしない状態で再生させたいモーションを”idle”タグとして、体をクリックして再生させたいモーションを”tap_body”タグとして分けます。括弧やカンマ打ち等プログラムを触ったことがある人もない人もお気をつけてください。

無事に修正が完了したら覚えやすい名前(キャラ名等)を行い拡張子を「.model.json」にして保存して終了です。

Unityへ移動させるファイルはこのjsonファイルのほかに、モーションフォルダ、テクスチャフォルダ、モックファイルです。この4つを使います。

以後はUnityでの操作です。

2015y08m22d_200606720

まず、自分の作成したキャラの名前のフォルダを作ります。(ここではtotomiフォルダになっています)

次に、その内部に先ほど使うと行った4つ、jsonファイル、モーションフォルダ、テクスチャ、モックファイルをドラッグ&ドロップします。

2015y08m22d_201448285

その後にメニューバーの「Live2D」→「CreateLive2DCanvas」をクリックしてキャンパスを作成し、分かりやすいように作成されたキャンパスの名前を変更します。

2015y08m22d_201747368

最後に、LAppModelProxyのPathに「live2d/(フォルダ名)/(.model.json名)」を打ち、無事に表示されればひと段落です。

2015y08m22d_201829183

その後再生ボタンを押し、体をクリックしてモーションが再生されれば無事に導入終了です。お疲れ様でした(*'ω'*)

-( ˘ᾥ˘ )問題発生した-----------------------------------------------------------------------------

もし、表示されない、モーションが再生されない等があれば以下の項目をチェックしてみてください。表示エラーがあればスクリプトのチェックが外れます。

---表示関連-----

上記のjsonファイルを参考に、カンマや括弧の打ち間違えが無いか

json内に書かれたフォルダ名と導入したフォルダ名が同じか

json内に書かれたモック名とモックファイル名は同じか

LAppModelProxyに書いたパスが合っているか

---モーション関連-----

json内に書かれたヒットエリア名とModelerで作成したネームとあっているか

json内に書かれたidとModelerで作成したidと合っているか

json内に書かれたモーション名と導入したモーション名があるか

大体がjsonファイルのスクリプトエラーが表示されない原因でした。ゆえに、ここをクリアできれば後は楽です

--------------------------------------------------------------------------------

それでは皆様よき、開発ライフを!!

| | コメント (0) | トラックバック (0)