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

ノイマンの軛 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


コメント

このブログの人気の投稿

MacOS Venture に PHPを入れて PukiWiki を移行した

  Pukiwiki でメモしたデータがあるので Mac Mini M2 に持っていく。 PukiWiki は PHP のアプリケーションであるため、PHP を動かさなければならない。 Mac Mini M2 で Apacheを動かした時、PHPがサポートされていないので CGI で動かす設定 をしたが、 これだけではだめ なようなので、結局、PHP をインストールした。 インストールした PHPは「署名して認証」しないと動かなかった。 PukiWiki は最新版にアップデートする必要があった。 PHP インストール $ brew install php ... $ To enable PHP in Apache add the following to httpd.conf and restart Apache: LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so < FilesMatch \.php$ > SetHandler application/x-httpd-php </ FilesMatch > Finally, check DirectoryIndex includes index.php DirectoryIndex index.php index.html The php.ini and php-fpm.ini file can be found in: /opt/homebrew/etc/php/8.2/ To start php now and restart at login: brew services start php httpd.conf を編集したが、エラーがでている。  $ apachectl configtest  [Fri Feb 24 20:46:41.855315 2023] [so:error] [pid 13516]  AH06665: No code signing authority for module  at /opt/homebrew/opt/php/lib/httpd/modules/libphp.so s...

2022年にいったゲルハルト・リヒター展を思い出しての塗装

  それでこのキャンバスはどう塗っていこうか  この投稿をInstagramで見る Kimio Tanaka(@kwin7862)がシェアした投稿