アニメーションしたキーの削除
「3DCG」カテゴリーアーカイブ
キャラクタにモーションを追加する
コントロールオブジェクトを選択し、Sキーでキーフレームを設定し、アニメーションを作成する。
まずはアイドリングのアニメーションを作成する。およそ2〜3秒で1回のアニメーションとすること。
この他に「歩く」「走る」の基本モーションと、ゲームの内容に応じて、「驚く」「伏せる」「怒る」「襲う」などを作成すること。アニメーションについては、グラフエディタなどを使いループ時のつなぎ目が無いように設定すること。
増分保存することで、リセットできるようにしておくこと。
アニメーションが設定できたら、編集>キー>シミュレーションのベイク処理 を実施する。設定は以下画像を参考に。
その後、ファイル>すべて書き出し>□
プリセットを編集>アニメーションをベイク処理>アニメーションをベイク処理にチェック をして書き出す。
Unity上でアニメーションが再生されます。この後、プログラムを使い、状況に応じて再生するアニメーションを変えることで、自分が操作しているように見せることができます。
コインドーザーの作成3
つづきです
次にボタンを押すとコインが落ちる仕組みを作成する
まず,
- GameObject>UI>Button でボタンを作成する
- ゲーム画面にボタンが表示される
- ヒエラルキーで作成されたボタンを選択する
- ボタンの位置調整をする.まず,右上を基準モードにする(画像1,2の順に選択)
- 次にゲーム画面を見ながら位置を調整し,画面の右端に移動させる(値は各自で自由に設定すること)
- GameObject>Create Emptyで空のオブジェクト(位置情報のみのオブジェクトになる)を作成する.後でこの位置からコインを生成させるための準備
- 名前はに変更しておくこと
- 参考の位置
- Asset内で右クリック>Create>C# Scriptを作成し,名前をcoin_genにする
- coin_genを開きスクリプトエディタ(Visual Studio等)を開き中身を以下に入れ替える
using System.Collections; using System.Collections.Generic; using UnityEngine; public class coin_gen : MonoBehaviour { public Transform spawnpos;//インスペクタに位置情報用のドロップボックスを表示 public GameObject coninPrefab;//プレファブをアサインするドロップボックスを表示 void Start () { } // Update is called once per frame void Update () { } //public化することでボタンからクリックで実行きるようになる public void genBtn(){ Vector3 pos = spawnpos.transform.position;//spawnposの位置をvector3形式にし,posに入れる Instantiate(coninPrefab, pos, Quaternion.identity);//coninPrefabを生成させる } }
- 再度空のオブジェクトを作成し,名前をscriptに変更する
- 作成したcoin_genをscriptにアサインする
- インスペクタに表示されたspawnposにspawnPointをアサインする
- (下図を確認)
- HierarchyにあるcoinをAssetsにドロップする. coinがPrefab化(青い色に変わる)する.Hierarchyのcoinはこの段階で取り除く
- ヒエラルキーにscriptを選択し,coinPreをCoinPrefabをにアサインする
- ゲームを再生し,ボタンを押しコインが落ちてくるのを確認する
時間があればさらに改造してみましょう.
追記(2018/10/12)
落ちてきたコインを消すスクリプト.コライダにアタッチする.ファイル名はdestroy.csとする.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class destroy : MonoBehaviour { public void OnTriggerEnter(Collider other){ Destroy(other.gameObject); } }
追記(2019/12/03)
move-blockがコインで弾かれる方は以下の設定をする
(A)move-block>RigidBody>Constrain のFreeze PositionをZ以外に全てチェックを入れる
(B)Coin(Prefab)のRigidBodyのMassをなるべく軽くする(0.05 kg)など
コインドーザーの作成2
つづき
- 各オブジェクトに名前をつける(画像を参考に)
- ここからはコインを押すプッシャーを作成する
- move_blockを選択し,Component>Physics>Rigidbodyを選択する
- 追加されたRigid BodyコンポーネントのUse Gravityをオフにする(重力に影響されなくなる)
- (更新)2018バージョンに合わせて動画手順を掲載します
- (動画の解説)まずmove_blockを選択し,InspectorからAddComponentを選択しAnimatorを追加する
- (動画の解説)Animationウィンドウ(またはAnimationタブ)のCreateボタンを押す
- (動画の解説)Animationの名前をblockにする
- (動画の解説)次に表示されたタイムラインのSamplesを30にする
- (動画の解説)左にあるAdd Propertyをクリックする
- (動画の解説)表示された中からTransfomのPositionの右にある+ボタンをクリック
- (動画の解説)ここから2秒前身,2秒後退するアニメーションを作成する
- (動画の解説)まず1秒付近にあるキーフレームを選択し,2秒に移動させる
- (動画の解説)次に再生バーも2秒に移動
- (動画の解説)次にPosition.zのキーフレームを選択する
- (動画の解説)Position.zの値を2にする
- (動画の解説)Animationの再生(ゲームの再生ではなく)し確認する
- (動画の解説)4秒付近に再生バーを移動し,キーフレームを追加する
- (動画の解説)さきほどと同様にposition.zの値を変化させる.今回は元の位置に戻すため4を入力する
- (動画の解説)再生し確認する
- Asset内のblock(アニメーションファイル)を探し,InspectorのLoop Timeにチェックを入れる(デフォルトでチェックが入っているかと思います)
- コインを落として確認してみる
(次へ)
コインドーザーの作成1
コインドーザーの作成
コインドーザー(コインプッシャー)を作成してみましょう.この内容は
- Physics(物理演算)の復習と応用
- 簡単なスクリプトによる制御
を演習します.
作成手順
- 新規シーンを作成
- Planを作成する.位置は(0,0,0)
- Planeの上にCubeを作成し図のように変更する
- このCubeを複製し,図のような位置に移動させる
- Cylinderを作成し,ScaleのYを0.1にする
- Cylinderを選択したまま,Component>Physics>Rigidbody を選択しRigidibodyコンポーネントを追加する
- このまま再生するとコインの動きにはならない
- それはCylinderにCapsule Colliderコンポーネントがついているためである
- そこでCapsule Colliderを取り除く.Capsule Colliderコンポーネントの右にある歯車アイコンからRemove Componentを選択する
- 次にMesh Colliderをアサインする.Component>Mesh Colliderを選択する
- 衝突を正確に計算するためにConvexにチェックを入れる
- 再生し確認してみること
- ここで一旦保存すること
(つぎへ)
簡単なゲームにしてみる(1)
概略
- 複数シーンをまたぐゲーム化をおこなう
- 今回は作成手順を理解するため,スクリプトは提供されたものを使用する
- 画像等は古いものを使っている場合がある
- 今回は指定個数のエサを何秒間でとることができるかを競うゲームとします
準備・パッケージの読み込み
- スクリプトなどが入ったedukit3.unitypackageをダウンロードする(ダウンロードはここから)
- Assets>ImportPackage>Custom Package… でダウンロードしたパッケージを読み込む
- Asset内にedukit3というフォルダが作成される
タグの準備
スクリプトを空のオブジェクトに配置する
- Gameobject>Create Empty で空のオブジェクトを作成し名前をscriptにする
- Asset内にある(さきほど読み込んだ)Edukit>myQuest をscriptにアサインする
- baitPrefabをbaitObjにアサインする(魚の下の矢印画像は後で表示できます)
- edukit3の中にあるSEフォルダを展開し,効果音をアサインする(画像参照)
- その他の数字も設定する
- ※時間がマイナス秒になっても動作するのは仕様です(追記)
解説
- GameObjectにどんなコンポーネントをアサインするかでそのオブジェクトの性質が変わる.カメラコンポーネントをアサインすればカメラに,Meshfilterをアサインすれば3Dオブジェクトに,今回はスクリプトだけをアサインしている
- この「空のオブジェクト」は便利な入れ物と考えてよい.CGソフトではNullや,ロケーターと呼ばれている
UIprefabを配置する
- Asset内にある(さきほど読み込んだ)Edukitの中のUIprefabをヒエラルキーにドロップする
- UIprefabを展開し,timeTextとnokorisuをmyQuestの該当の箇所にドロップする
- エンディングシーン名も指定する
- なおUIについてはこちらも参考に
Tapで泳ぐプログラムを追加する
概要
- 移動できる範囲を決めるNavMeshを設定
- 魚にNavigationAgentを設定する
- Tap移動のプログラムを魚にアサインする
設定など
- 地面代わりのPlaneなどを置く.そのPlaneにNavMeshの設定(こちらを参考に)をする
- HierarchyのmyFishを選択し,InspectorのAdd Componentを押しnavで検索すると出てくるNav Mesh Agentを選択して追加する
- 追加したNav Mesh AgentのBase Offsetを0.5にする
- TapMove用UnityPackageをここからダウンロードする
- ダウンロードしたUnityPackageファイルをAssets>Import Package>Custom Packageで読み込む
- Assets内にTapMoveフォルダができる.この中のtapMoveスクリプトをステージ上のmyFishにアサインする
- 次にInspectorのtapMoveにcirclePrefabをアサインし,RayLengthを15くらいにする
- Multipurpose CameraRigを設定する(忘れた場合はこちら).ターゲットはmyFishとする.魚とカメラの距離はPivotで調整する.MainCameraを削除するのを忘れないこと
- 一旦保存し,ゲームを再生,Planeの上をクリックしてみる
- 魚が泳いでいきます.クリックはタップにも対応しているので,スマートホン用にビルドした場合はタップで魚が泳ぎます
- タップで誤動作がおきる場合は,myFishのレイヤーをDefautl以外にする.タップを検知するレイヤーはDefaultレイヤーのみになっているため
- 以下参考動画
(Unityへの読み込みはここまで)
UnityにFBXファイルを読み込む(2)
Animation Controllerの設定
- Assets>Create>AnimationControllerでAnimationControllerを作成する.名前はfishControllerにしておく(名前は何でもかまわない)
- 作成したAnimationControllerをダブルクリックする
- Animation Contorller画面が開かれる
- この画面にFish内のTake 002をAnimation Contorller画面にドロップする
- 間違えてTake 001をドロップ場合は,Take 002をドロップし,Take 002の上で右クリックしSet As Layer Default Stateを選択する
- 緑のEntryのとTake 002が接続されていればOK
- この設定はこのシーンが始まった場合にTake 002を自動でループ再生させるという意味.キャラクタが何もしていない時の動作をIdle(アイドル)と呼ぶが,これでTake 002がIdleの動作となった
- 次にTake 001のアニメーションをドロップする
- ライトグリーンのAny Stateの上で右クリックし,Make Transitionを選択し,Take 001につなげる
- これでどんな動作の状態(Any State)からでもTake 001のアニメーションが再生できる
- 次に,Take 001の上で右クリックし,Take002につなげる
- これで.Take 001は1度しか再生しないため,再生が終わった後にIdleの動きに戻せた
- 跳ねる動きが長いため,Take001を選択しInspectorのSpeedを3にする(3倍速再生)
- 同様に尾びれを動かす動作の1サイクルが長いため,Take002を選択しInspectorのSpeedを2にする(2倍速再生)
- この再生速度は目安です.好きな値に設定してかまいません.
- 次にTake 001を再生するトリガーを設定する
- Parametersのタブの+ボタンからTriggerを選択しトリガーを追加,名前をswimにする(この名前は変えないこと)
- 次にAny StateからTake 001につながる矢印を選択し,InspectorのConditionsの+ボタンを押し,swimを選択する
- これでswimのトリガーでTake001が再生され,その後Take 002のくり返し再生に戻る設定ができた.このように何か動作をしたら必ずIdleの動作に戻す必要がある
myFishをシーンに配置する
UnityにFBXファイルを読み込む(1)
概要
FBXファイルを読み込み,アニメーションを分割し動作に応じた動きの設定をする
Unityへの読み込み
- Assets内にドラッグ&ドロップ(以下D&D)してmyFish.fbxを読み込む
- myFishを選択し,Inspectorに魚が表示されるので,再生ボタンを押し,アニメーションが読み込まれているか確認する
- 以前作成した魚のテクスチャをD&Dで読み込む.これでテクスチャが反映される(※テクスチャがうまく貼れていない場合はUVを設定する前のモデルを使っている可能性がある)
- InspectorのModelのタブにあるScale Factorを10(10倍の大きさ)にし,Applyを押す
- Rigのタブを選択し,Root nodeをjoint1にし,Applyを押す
- Animationのタブを選択
- Clipsの下のスライドバーまたはテキストボックスで,魚がジャンプしはじめ,終わるまでの範囲を指定する.Startが3,Endが25くらいでいい.これで200フレームあったアニメーションの最初部分が分けられた
- Applyをクリックする
- 次にClipsの右下にある+ボタンを押す.Take001(1)またはTake 002が作成されるのでそれを選択する(名前を変更する場合は下の入力フィールドを使うこと)
- これで読み込んだ200フレームのアニメーションが,Take 001とTake 002に分けられた
- 魚の尾びれが1サイクルするアニメーションの範囲を指定する.(参考値Startは128,Endは166)
- 次にLoop Timeにチェックを入れ,Loop Poseにもチェックを入れる
- loop matchのランプがグリーンになっていることを確認する
- Root Transform RotationのBased Upon(at Start)をOriginalにする.またRoot Transform PositionのBased UponもOriginalにする
- 同様にTake 001を選択し,Root Transform RotationのBased Upon(at Start)をOriginalに,またRoot Transform PositionのBased UponもOriginalにする
- Fishの右矢印を開いて展開すると中にTake 001とTake 002のアニメーション2種類ができているのを確認すること