スキップしてメイン コンテンツに移動

ノイマンの軛 Von Neumann bottleneck が解けてきた

Unityでドアの開閉はAnimatorそれともiTween?


Mac Mini M2 の Unity で Sketchup のデータを復元したつづき。
以前、苦労して作成したドアの開閉が動作しないので修復する。
どうやって動かしていたのか、また忘れそうなので記録しておく。            



Animator


  1. 左右のドア PlaneL, PlaneR に Animator : PlaneL2, PlaneR2 を設定
  2. Animator はそれぞれ OpenDoor, CloseDoor, idleDoor の3つの Animation を制御
    Parameter : openDoor (Bool) を設定
  3. Animation には Transitions とその動作条件 Parameter : openDoor を設定
    Animation Window(cmd+6) で時間による動作を設定
  4. C# からの実行: "openDoor" の値を設定
 public Animator animatorBoschDoorRight;
 public Animator animatorBoschDoorLeft;

 public void animatorDoor(){
   SoundManager.Instance.PlaySE(23);  // ドアの開閉開始時の効果音
   animatorBoschDoorRight.SetBool("openDoor", !animatorBoschDoorRight.GetBool("openDoor"));
   animatorBoschDoorLeft.SetBool("openDoor", !animatorBoschDoorLeft.GetBool("openDoor"));
 }
 public void OnAnimationCompleted(string doorObj){
   SoundManager.Instance.PlaySE(24);  // ドアの開閉終了時の効果音
 }
ドアの開閉開始時の効果音は簡単だが、開閉終了時の実行はタイミングを測るのが難しい。
  1. Animation Windows でイベントを追加(OpenDoorR2, CloseDoorR)
  2. イベントの実行タイミングを指定
  3. 実行する Function を設定
  4. このとき Object はイベントを追加した Animation を含むものを指定しなければならないので注意。( OpenDoorR2 でも PlaneR2 でもOK)

    Function が設定済みの Object があるからといって、Animation に関係ないものを指定すると「AnimationEvent 'OnAnimationCompleted' has no receiver!のエラー」になる。


iTween

そもそも「ヘントの祭壇画」の開くのをやりたくてドアの開閉を始めたのだった。
iTween で実装したが、Cluster ではスクリプトが使えないため、Animator を学習しながら動かした。これが上手くいたので、絵だけ差し替えてヒエロムニス・ボスの「快楽の園」の扉を動かしたのだった。 


画像を回転させながら、横移動していたが、画像の横幅が2倍のObject を作成して、これの片側に寄せて画像を置けば回転だけで済むことにいまさら気がついた。


上下動を加えたが、基本は左右のドアを iTween.RateTo するだけ。

public void doorOpenClose(){
Debug.Log("L31 doorControl.cs right rot: " + doorRight.transform.localEulerAngles.z);
SoundManager.Instance.PlaySE(23); // ドアの開閉動時のギーーという音
float z = 180f;
float t = 5f;
float zz = 10f; // ドアの上下動の量
if(doorRight.transform.localEulerAngles.z == 180f){ // 開く
iTween.RotateTo(doorLeft, iTween.Hash("time", t, "z", -z,
"oncomplete", "onDoorRotateComplete", "oncompletetarget", this.gameObject));
iTween.MoveBy (doorLeft, iTween.Hash("time", t, "z", -zz));
iTween.RotateTo(doorRight, iTween.Hash("time", t, "z", z));
iTween.MoveBy (doorRight, iTween.Hash("time", t, "z", -zz));
}else if(doorRight.transform.localEulerAngles.z < 1f ){ // 閉じる
iTween.RotateTo(doorLeft, iTween.Hash("time", t, "z", z,"oncomplete",
"onDoorRotateComplete", "oncompletetarget", this.gameObject));
iTween.MoveBy (doorLeft, iTween.Hash("time", t, "z", -zz));
iTween.RotateTo(doorRight, iTween.Hash("time", t, "z", -z));
iTween.MoveBy (doorRight, iTween.Hash("time", t, "z", -zz));
}
}

void onDoorRotateComplete(){
SoundManager.Instance.PlaySE(24); // ドアが開閉終了時のバッタンという音
float t = 0.75f;
float zz = 10f;
iTween.MoveBy (doorLeft, iTween.Hash("time", t, "z", zz));
iTween.MoveBy (doorRight, iTween.Hash("time", t, "z", zz));
}











参考
【Unity】アニメーション終了時にメソッドを呼び出す
https://takap-tech.com/entry/2021/04/13/013635


コメント

このブログの人気の投稿

Mac Mini M2 に Google Sketchup のデータをもっていった

Google Sketchup の頃、作成した3Dモデルを Web版で開いてみた。   https://app.sketchup.com/app?hl=ja このファイルは Unity で読み込むことができているので、見慣れた光景ではあるが、懐かしさを感じる。 もう、Sketchup は Goolge から米Trimble Navigation Limited に移ってしまっている。 Google Earth に 3D Object がところどころに配置されていたものだった。 Unity で Sketchup で作成した .skp ファイルをインポートすることができる。 Unity経由で  Cluster にも公開してある。 https://cluster.mu/w/a8c634be-0371-4f86-91c6-4f5cacea589c さて、Mac Mini M2 で以前作成したUnityのプロジェクトを開いてみたところ、Sketchup からのデータが表示されていない。 さんざん調べたところ、どうやら Silicon 版Unity では Sketchup ファイルは 現在 サポートされていない。( そのうちサポートされるらしい ) Siliicon Mac の壁にこんなところで遭遇するとは。 対応策としては  intel 版の Unity をインストールして使う Sketchup 2017 をダウンロードして FBX にエクスポートする Web版の Sketchup に課金して FBX にエクスポートする などがあるらしい。Trimble のサイトでは Sketchup 2017バージョンはダウンロードできなくなっているが、Windows用の 2017 を探し出して、昔の .skp ファイルを無事読み込むことができた。Mac Mini M2 登場で、少し前に買って失敗した .... ゲーミング Windows PC が役にたって少し嬉しい。 skp ファイルは 3Dモデルも画像もまとめて取り込むことができたが、FBXだと画像が付いてこないので、今回の場合、使い物にならない。 OBJ形式でエクスポートしてできた .obj と .mtl ファイルと 画像が入ったフォルダの3つを Unity へ ドラッグ&ドロップしたところ、上手くいっ...

Mac Mini M2のUnity+VSCodeでまた「一致するワークスペースシンボルがありません」で悩む

  Unity のスクリプト・エディタとして Visual Studio Code を設定する。 Settings...  - External Tools - External Script Editor :  Visual Studio Code Comand + T で関数一覧を表示できるのが便利だが、以前より時々 「一致するワークスペースシンボルがありません」 で 表示されないことがあるので悩んでいた。 肝心なことを先に書いておくと、Visual Studio Codeのログに大量に出力されているエラーに惑わされてはいけない。これらのエラーがあってもワークスペースシンボルは表示される。 さて、Mac Mini M2 でも 「一致するワークスペースシンボルがありません」 だった。 拡張機能の C# もインストールしてある。 .Net Core SDK もインストールしてある。 Unity側で .csproj ファイルを作成する機能をみつけ(以前からあった???) 「Regenerate project files」を実行。 これで、 開いている .cs ファイルに改行でも追加すれば 、ワークスペースシンボルのリストが表示されるようになる。 しかし、 これ を忘れてしまっていて「OmniSharp Log」の大量エラーをみて [fail]: OmniSharp.MSBuild.ProjectLoader This project targets .NET version that requires reference assemblies that are not installed (e.g. .NET Framework). The most common solution is to make sure Mono is fully updated on your machine (https://mono-project.com/download/) and that you are running the .NET Framework build of OmniSharp (e.g. 'omnisharp.u...

高圧洗浄機で屋根を洗う

高圧洗浄機で屋根の汚れを落とすための治具を製作したので、試運転してみた。  鉄の使い方をおぼえると製作物の幅が広がることを実感した。 結果は上々であったが、やはり洗浄機のスプレーガンはそこそこ重いので水平に持ち上げての作業は疲れる。 検討課題 屋根に登らずに洗浄できる範囲も限られているので、安全に屋根に登って作業できるようにしたい。