2023年5月7日日曜日

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 にも公開してある。

さて、Mac Mini M2 で以前作成したUnityのプロジェクトを開いてみたところ、Sketchup からのデータが表示されていない。

さんざん調べたところ、どうやら Silicon 版Unity では Sketchup ファイルは現在サポートされていない。(そのうちサポートされるらしい
Siliicon Mac の壁にこんなところで遭遇するとは。

対応策としては
  1.  intel 版の Unity をインストールして使う
  2. Sketchup 2017 をダウンロードして FBX にエクスポートする
  3. Web版の Sketchup に課金して FBX にエクスポートする
などがあるらしい。Trimble のサイトでは Sketchup 2017バージョンはダウンロードできなくなっているが、Windows用の 2017 を探し出して、昔の .skp ファイルを無事読み込むことができた。Mac Mini M2 登場で、少し前に買って失敗した .... ゲーミング Windows PC が役にたって少し嬉しい。

skp ファイルは 3Dモデルも画像もまとめて取り込むことができたが、FBXだと画像が付いてこないので、今回の場合、使い物にならない。
OBJ形式でエクスポートしてできた .obj と .mtl ファイルと 画像が入ったフォルダの3つを Unity へ ドラッグ&ドロップしたところ、上手くいった。(Unity 2019.4 くらいからマテリアル情報 .mtl 対応したらしい)

無事、WebGLビルドまでできたが、位置情報が以前と変わってしまっていたり、Sketchup からのモデルに Unity で追加した部分は再度やり直す必要があり、それなりの工数がかかりそう。
その上、なぜか追加した子部品の座標情報が以前とは違うとんでもないところに行っていたりで悩ましい。


参考

Unity2019.4くらいからOBJ形式のマテリアル情報(.mtl)に対応しててビックリ

「Google SketchUp」後継の無償3Dモデリングソフト「SketchUp Make」が公開(2013/5/24 16:11)









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.useModernNet': false in C# Extension for VS Code).
 

mono やらバージョンが違う .Net Core SDK などをインストールしてしまったので、UnInstall した。


mono Uninstall

ターミナルで実行
  sudo /bin/sh -x
rm -r /Library/Frameworks/Mono.framework
rm -r /Library/Receipts/MonoFramework-*
for dir in /usr/bin /usr/share/man/man1 /usr/share/man/man4 /usr/share/man/man5; do
(cd ${dir};
for i in `ls -al | grep /Library/Frameworks/Mono.framework/ | awk '{print $9}'`; do
rm ${i}
done);
done
 
「このMacについて」-「詳細情報」-「システムレポート」の「フレームワーク」から Mono が消えればOK。

参考: Uninstalling Mono Framework.
https://discussions.apple.com/thread/3848498


.Net Core SDK Uninstall

version="7.0.102"をインストールしてあるので、古いものを削除した
version="6.0.405"
sudo rm -rf /usr/local/share/dotnet/sdk/$version
sudo rm -rf /usr/local/share/dotnet/shared/Microsoft.NETCore.App/$version
sudo rm -rf /usr/local/share/dotnet/shared/Microsoft.AspNetCore.All/$version
sudo rm -rf /usr/local/share/dotnet/shared/Microsoft.AspNetCore.App/$version
sudo rm -rf /usr/local/share/dotnet/host/fxr/$version


参考 : .NET ランタイムと SDK を削除する方法
https://learn.microsoft.com/ja-jp/dotnet/core/install/remove-runtime-sdk-versions?pivots=os-macos


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

 


Pukiwiki でメモしたデータがあるので Mac Mini M2 に持っていく。

PukiWiki は PHP のアプリケーションであるため、PHP を動かさなければならない。

  1. Mac Mini M2 で Apacheを動かした時、PHPがサポートされていないので CGI で動かす設定をしたが、これだけではだめなようなので、結局、PHP をインストールした。
  2. インストールした PHPは「署名して認証」しないと動かなかった。
  3. 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 specified in LoadModule directive.

apachectl restart したが

 <?php
  phpinfo();
 ?>

phpinfo() も動かない。Apache のエラーログを見たところ、error が吐かれている。


$ cat /private/var/log/apache2/error_log

'/opt/homebrew/Cellar/php/8.2.3/lib/php/20220829/opcache.so' not valid
for use in process: mapped file has no Team ID and is not a platform binary
(signed with custom identity or adhoc?)), ....

署名して認証


~/Library/Keychains に login.keychain-db ファイルを確認して codesign を実行。


$ codesign --sign "myCA" --force --keychain ~/Library/Keychains/login.keychain-db \
/opt/homebrew/opt/php/lib/httpd/modules/libphp.so

httpd.conf に署名。

LoadModule php_module /opt/homebrew/opt/php/lib/httpd/modules/libphp.so "myCA"


PukiWki

phpinfo() は動いたが、PukiWiki は動かない。
index.php の error_reportting(E_ALL) をコメントアウトしたところ

<?php
// PukiWiki - Yet another WikiWikiWeb clone.
// $Id: index.php,v 1.9 2006/05/13 07:39:49 henoheno Exp $
// Copyright (C) 2001-2006 PukiWiki Developers Team
// License: GPL v2 or (at your option) any later version

// Error reporting
//error_reporting(0); // Nothing
error_reporting(E_ERROR | E_PARSE); // Avoid E_WARNING, E_NOTICE, etc
//error_reporting(E_ALL); // Debug purpose

エラーが表示された。
「Fatal error: Array and string offset access syntax with curly braces is no longer supported in /Users/xxx/pukiwiki/lib/func.php on line 607」

https://pukiwiki.osdn.jp/?FAQ/45 によると

「PukiWiki 1.4.7 はPHP5.4以降に対応しておらず、まったく動作しません。PukiWiki 1.5.0 へのバージョンアップを行ってください。」

とのことなので最新版の 1.5.4 をダウンロードして展開して 
 pukiwiki/wiki/ フォルダのファイルを以前の wiki フォルダで上書きした。

PukiWiki はちゃんとメンテナンスされているようで、よかった。


参考

【macOS 12 Monterey】コード署名証明書によるPHPモジュール有効化 
https://pointsandlines.jp/server-side/php/code-signing-in-macos-monterey

Mac Mini M2とWindowsで共有できるSDカードにパスワードを設定



以前、 SSDに dmg ファイルを作成しパスワード設定していたが、これだとWindowsでは利用できない。

ChatGPTに”WindowsとMacで共有できてパスワードが設定できるSDカードの作り方を教えて”と聞いてみたら「TrueCrypt」を教えてくれた。

VeraCrypt が後継のようなのでインストールしようとしたところ、MacFUSEも必要そうなので、確認したところ

"ただし、注意点として、MacFUSEは古いバージョンのMac OS Xでのみサポートされています。Mac OS X 10.13 High Sierra以降のバージョンでは、macOSのセキュリティ機能が更新されたため、MacFUSEを使用する場合は、一部の設定変更が必要となります。したがって、使用する前に、必ず公式サイトやドキュメントを確認してください。"

といわれた。

実際、MacFUSE と VeraCrypt をインストールして利用を進めると
「電源ボタンを長押し ... 起動セキュリティーユーティリティで...」と表示された。

シリコンMac(Mac Mini M2)の場合、10秒以上電源ボタンを長押しして起動すると、メンテナンス画面になるので「オプション」を選択して、画面左上のメニューの「ユーティリティ」を選ぶのがポイントだった。

 Windowsの方にも VeraCrypt を入れて 256GBのSDカードに130GBのストレージを作成したが、フォーマットに30分以上かかったのではないだろうか。


参考

Appleシリコンを搭載したMacのセキュリティーポリシー変更手順
https://support.d-imaging.sony.co.jp/mac/security/11/ja/index.html

2018年4月9日月曜日

Migration Python2.7への移行

1. 以前のプログラムのソースをダウンロードして、 app.xml を変更して deployする

503 python -V   // まず Mac にインストールされている python のバージョンを確認
504 pwd
505 curl https://sdk.cloud.google.com | bash // google cloud SDK のインストール
506 source ./.bash_profile 
510 cd google-cloud-sdk/  // 以前作成したアプリのダウンロードの準備
514 mkdir google-cloud
515 cd google-cloud
516 appcfg.py download_app -A snsimglink-hrd -V 1 ./ -oauth2  // appcfg.py がみつからない
517 python appcfg.py download_app -A snsimglink-hrd -V 1 ./ -oauth2 // 無駄な試み 
519 cd ..
520 cd google-cloud-sdk/
523 find . -name appcfg.py -print  // みあたらない
527 pip install google-cloud-storage // google-cloud-storage をいれればいいのか? 
528 sudo easy_install pip   // pip がなかったのでまず pip を install
529 pip install --upgrade google-cloud-storage

// https://cloud.google.com/appengine/docs/standard/python/download#appengine_sdk 
// appcfg.py を入手するには
// 以前の GoogleAppEngineLauncher-1.9.68.dmg 
// をインストールする必要があった
537 cd google-cloud 
// google cloud のコンソールで application の名前とバージョンを確認
540 appcfg.py -A museum-in-cloud-hrd -V 1 download_app ./museum-in-cloud
543 cd snsimglink/
547 dev_appserver.py . // 試しにローカルで動かそうとするもいろいろエラーで動かない
548 gcloud app deploy
549 cloudg auth login
550 cloudg app deploy
551 cloudg config set project museum-in-cloud-hrd

553 gcl app deoudloyp  // app.xmlappclitaion, version をコメントアウト
      ERROR: 
      (gcloud.app.deploy) The [application] field is specified in file ..
      (gcloud.app.deploy) The [version] field is specified in file ..
 ...
        This field is not used by gcloud and must be removed. 
    Versions are generated automatically by default but can also be manually specified 
    by setting the `--version` flag on individual command executions.

555 gcloud app deploy -v 2 // バージョン指定しないと deploy するたびに新しいバージョンになってしまう

2.  webapp を webapp2 にdjango を jinja2 に変更する

Python2.7 でも django はサポートされているようなので引き続き使おうとしたが
サンプルプログラムを動かすために SQL Cloud などの設定も必要

gusestbook のサンプルプログラムが更新されていて、ここで jinja2 が使われていたので、
jinja2 を利用することにした。
app.xml
---
#application: museum-in-cloud-hrd
#version: 1
#runtime: python
runtime: python27
api_version: 1
threadsafe: true

handlers:

- url: /blog
#  script: hw_blog.py
  script: hw_blog.app

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest
#- name: django
#  version: "1.2"

hw.py
---
#from google.appengine.ext import webapp
import webapp2
import jinja2
JINJA_ENVIRONMENT = jinja2.Environment(
loader=jinja2.FileSystemLoader(os.path.dirname(__file__)+"/templates4j"),  //この環境固有
    extensions=['jinja2.ext.autoescape'],
    autoescape=True)
#from google.appengine.ext import vendor
#vendor.add('lib')

3.   jinja2 用に templateファルを変更する

 ifequal endifequal を if endif 
{% value %} を {{ value }} に変更
変数の中に html のタグなどを記述していた場合は {{ value | safe }} とする

4.  準備中

準備中
console
参考






Swift UI チュートリアル Loading watchOS が終わらない?

Loading watchOS が終わらない? ディスク容量の残量が少ないので不要なシュミレーターを削除したとこころ watchOSのものが全部なくなってしまっていた。 WatchOS を削除して再度インストールしても復活せず。 Create a new simulator で ...