一括表示

記事No: 21504
タイトル範囲内に入ると反応する自動ドアのようなイベントをコモンで作りたい
投稿日: 2023/03/07 15:13
投稿者猫大好き [erdriprW988(海外)]

[やりたいこと]
プロ版で一定範囲内に入るとSEと共にイベントにセットされたチップが変化して扉が開き、範囲内にいる間は開き続け範囲外に出るとSEと共に閉じる、というのをコモンでやりたいです。
[やってみたこと]
レビニアさんの「【ウディタ解説】近づくと起動して離れると停止するコモンを作る【自作】」と未知広さんの「ウディタでお手軽にドアを開け閉めする演出コモンを作成! めっちゃ丁寧に解説します」を参考に以下のコモンを作りました。

起動条件 呼び出しのみ

▼呼出元マップイベントと主人公の距離を算出
■変数操作+:CSelf10[接触範囲X]=このマップイベントの接触範囲拡張X
■変数操作+:CSelf11[接触範囲Y]=このマップイベントの接触範囲拡張Y
■変数操作+:CSelf12[呼出元X]=このマップイベントのX座標(精密)
■変数操作+:CSelf13[呼出元Y]=このマップイベントのY座標(精密)
■変数操作+:CSelf14[主人公X]=主人公のX座標(精密)
■変数操作+:CSelf15[主人公Y]=主人公のY座標(精密)
■変数操作+:CSelf16[Evとの距離X]絶対値=Cself14[主人公X]-CSelf12[呼出元X]
■変数操作+:CSelf17[Evとの距離Y]絶対値=Cself15[主人公X]-CSelf13[呼出元Y]
▼接触範囲外なら「0」を返す(停止)
■変数操作+:CSelf0[マップEvID]=現在のマップID
■ウェイト:1フレーム
■条件分岐(変数):【1】CSelf16[Evとの距離X]がCSelf10[接触範囲X]以上【2】CSelf17[Evとの距離Y]がCSelf11[接触範囲Y]以上
◇分岐:【1】[CSelf16[Evとの距離X]がCSelf10[接触範囲X]以上]の場合↓
│■サウンド:SEファイル[SE/開く音.mp3]音100%(0チャンネル)再生/遅延:0フレーム
│■ウェイト:1フレーム
│■動作指定:このイベント/上向/ウエイト2フレーム/右向/ウェイト2フレーム/左向/ウェイト2フレーム/下向/すり抜けOFF
│■変数操作:Cself4[起動/停止]=0+0
│■イベント処理中断
│■
◇分岐【2】[CSelf17[Evとの距離Y]がCSelf11[接触範囲Y]以上]の場合↓
│■サウンド:SEファイル[SE/開く音.mp3]音100%(0チャンネル)再生/遅延:0フレーム
│■ウェイト:1フレーム
│■動作指定:このイベント/上向/ウエイト2フレーム/右向/ウェイト2フレーム/左向/ウェイト2フレーム/下向/すり抜けOFF
│■変数操作:Cself4[起動/停止]=0+0
│■イベント処理中断
│■
◇分岐終了◇
■条件分岐(変数):【1】Cself4【起動/停止】が0と同じ【2】Cself4【起動/停止】が1以上
│◇分岐:【1】Cself4【起動/停止】が0と同じの場合↓
│▼接触範囲内で未起動なら「1」を返す(起動)
│■サウンド:SEファイル[SE/閉まる音.mp3]音100%(0チャンネル)再生/遅延:0フレーム
│■ウェイト:1フレーム
│■動作指定このイベント/下向/ウエイト2フレーム/左向/ウェイト2フレーム/右向/ウェイト2フレーム/上向/すり抜けON
│■変数操作:Cself4[起動/停止]=1+0
│■
◇分岐:【2】[CSelf4[起動/停止]が1以上]の場合↓
│▼接触範囲内且つ既に起動しているなら「2」を返す(起動済み)
│■ウェイト1フレーム
│■変数操作:CSelf4[起動/停止]=2+0
│■
◇分岐終了◇


イベントには上から順に
1:閉じているドア
2:少し開いているドア
3:更に開いているドア
4:開ききったドア
と、なっているマップチップをセットしました。
[やってみた結果、どううまくいかないか]
縦に扉のイベント上を通り抜けようとするとSEはちゃんとなるのですが扉がガチャガチャ動いて自然に開いているように見えません。その時SEが何度も重なって聞こえてしまったりもします。イベント横を縦に通ると扉がビクビク動いているような挙動をしてしまいます。
また、イベントを横に通り抜けると今度はSEが鳴った後扉が開きっぱなしになってしまいます。こうなると縦に通り抜け直さないと範囲内に入った時びくつくだけでSEも鳴らず、上手く動きません。
別のコモンを使ってこの自動ドアのコモンのCSelf4の起動/停止をピクチャ表示して監視したところ、縦に通り抜けた時は範囲外で0、範囲内で1、横に通り抜けた時は1度通ってしまうと後の扉が開きっぱなしになっている時は2になり続けていました。
スムーズに自然な動きで扉の開け閉めできるようにセットしたいのですが、私の知恵ではどこが悪いのか分かりません。
試しにウェイトを1フレームを所々に差し込んでみたり動作の後に動作完了までウェイトを差し込んでみたりしても改善しませんでした。
問題点が分からず、またいい解決策も思いつかず、ほとほと困り果てております。
皆様のお知恵をお借り出来たらと思います。
よろしくお願い致します。


記事No: 21505
タイトルRe: 範囲内に入ると反応する自動ドアのようなイベントをコモンで作りたい
投稿日: 2023/03/08 21:11
投稿者YADO [LerLWW459(海外)]

> [やりたいこと]
> プロ版で一定範囲内に入るとSEと共にイベントにセットされたチップが変化して扉が開き、範囲内にいる間は開き続け範囲外に出るとSEと共に閉じる、というのをコモンでやりたいです。
> [やってみたこと]
> レビニアさんの「【ウディタ解説】近づくと起動して離れると停止するコモンを作る【自作】」と未知広さんの「ウディタでお手軽にドアを開け閉めする演出コモンを作成! めっちゃ丁寧に解説します」を参考に以下のコモンを作りました。
>
> 起動条件 呼び出しのみ
>
> ▼呼出元マップイベントと主人公の距離を算出
> ■変数操作+:CSelf10[接触範囲X]=このマップイベントの接触範囲拡張X
> ■変数操作+:CSelf11[接触範囲Y]=このマップイベントの接触範囲拡張Y
> ■変数操作+:CSelf12[呼出元X]=このマップイベントのX座標(精密)
> ■変数操作+:CSelf13[呼出元Y]=このマップイベントのY座標(精密)
> ■変数操作+:CSelf14[主人公X]=主人公のX座標(精密)
> ■変数操作+:CSelf15[主人公Y]=主人公のY座標(精密)
> ■変数操作+:CSelf16[Evとの距離X]絶対値=Cself14[主人公X]-CSelf12[呼出元X]
> ■変数操作+:CSelf17[Evとの距離Y]絶対値=Cself15[主人公X]-CSelf13[呼出元Y]
> ▼接触範囲外なら「0」を返す(停止)
> ■変数操作+:CSelf0[マップEvID]=現在のマップID
> ■ウェイト:1フレーム
> ■条件分岐(変数):【1】CSelf16[Evとの距離X]がCSelf10[接触範囲X]以上【2】CSelf17[Evとの距離Y]がCSelf11[接触範囲Y]以上
> ◇分岐:【1】[CSelf16[Evとの距離X]がCSelf10[接触範囲X]以上]の場合↓
> │■サウンド:SEファイル[SE/開く音.mp3]音100%(0チャンネル)再生/遅延:0フレーム
> │■ウェイト:1フレーム
> │■動作指定:このイベント/上向/ウエイト2フレーム/右向/ウェイト2フレーム/左向/ウェイト2フレーム/下向/すり抜けOFF
> │■変数操作:Cself4[起動/停止]=0+0
> │■イベント処理中断
> │■
> ◇分岐【2】[CSelf17[Evとの距離Y]がCSelf11[接触範囲Y]以上]の場合↓
> │■サウンド:SEファイル[SE/開く音.mp3]音100%(0チャンネル)再生/遅延:0フレーム
> │■ウェイト:1フレーム
> │■動作指定:このイベント/上向/ウエイト2フレーム/右向/ウェイト2フレーム/左向/ウェイト2フレーム/下向/すり抜けOFF
> │■変数操作:Cself4[起動/停止]=0+0
> │■イベント処理中断
> │■
> ◇分岐終了◇
> ■条件分岐(変数):【1】Cself4【起動/停止】が0と同じ【2】Cself4【起動/停止】が1以上
> │◇分岐:【1】Cself4【起動/停止】が0と同じの場合↓
> │▼接触範囲内で未起動なら「1」を返す(起動)
> │■サウンド:SEファイル[SE/閉まる音.mp3]音100%(0チャンネル)再生/遅延:0フレーム
> │■ウェイト:1フレーム
> │■動作指定このイベント/下向/ウエイト2フレーム/左向/ウェイト2フレーム/右向/ウェイト2フレーム/上向/すり抜けON
> │■変数操作:Cself4[起動/停止]=1+0
> │■
> ◇分岐:【2】[CSelf4[起動/停止]が1以上]の場合↓
> │▼接触範囲内且つ既に起動しているなら「2」を返す(起動済み)
> │■ウェイト1フレーム
> │■変数操作:CSelf4[起動/停止]=2+0
> │■
> ◇分岐終了◇
> ■
>
> イベントには上から順に
> 1:閉じているドア
> 2:少し開いているドア
> 3:更に開いているドア
> 4:開ききったドア
> と、なっているマップチップをセットしました。
> [やってみた結果、どううまくいかないか]
> 縦に扉のイベント上を通り抜けようとするとSEはちゃんとなるのですが扉がガチャガチャ動いて自然に開いているように見えません。その時SEが何度も重なって聞こえてしまったりもします。イベント横を縦に通ると扉がビクビク動いているような挙動をしてしまいます。
> また、イベントを横に通り抜けると今度はSEが鳴った後扉が開きっぱなしになってしまいます。こうなると縦に通り抜け直さないと範囲内に入った時びくつくだけでSEも鳴らず、上手く動きません。
> 別のコモンを使ってこの自動ドアのコモンのCSelf4の起動/停止をピクチャ表示して監視したところ、縦に通り抜けた時は範囲外で0、範囲内で1、横に通り抜けた時は1度通ってしまうと後の扉が開きっぱなしになっている時は2になり続けていました。
> スムーズに自然な動きで扉の開け閉めできるようにセットしたいのですが、私の知恵ではどこが悪いのか分かりません。
> 試しにウェイトを1フレームを所々に差し込んでみたり動作の後に動作完了までウェイトを差し込んでみたりしても改善しませんでした。
> 問題点が分からず、またいい解決策も思いつかず、ほとほと困り果てております。
> 皆様のお知恵をお借り出来たらと思います。
> よろしくお願い致します。

■ウェイト:1フレーム
を設定すると、マップイベントが主人公の方を向いてしまうので、全て削除した良いです。

範囲外に出る時の処理は、セルフ4が1以上の時だけ実行するようにした方が良いです。
■条件分岐(変数): 【1】 CSelf16 が CSelf10 以上 【2】 CSelf17 が CSelf11 以上
-◇分岐: 【1】 [ CSelf16 が CSelf10 以上 ]の場合↓
|■条件分岐(変数): 【1】 CSelf4 が 1 以上
|-◇分岐: 【1】 [ CSelf4 が 1 以上 ]の場合↓
| |■サウンド:SE ファイル[SE/[System]Get1_default.ogg] 音 100% 周 100% (0 チャンネル) 再生 / 遅延:0フレーム
| |■動作指定:このイベント / 上向 / ウェイト 2フレーム / 右向 / ウェイト 2フレーム / 左向 / ウェイト 2フレーム / 下向 / すり抜けOFF
| |■変数操作: CSelf4 = 0 + 0
| |■
|◇分岐終了◇
|■イベント処理中断
|■
-◇分岐: 【2】 [ CSelf17 が CSelf11 以上 ]の場合↓
|■条件分岐(変数): 【1】 CSelf4 が 1 以上
|-◇分岐: 【1】 [ CSelf4 が 1 以上 ]の場合↓
| |■サウンド:SE ファイル[SE/[System]Get1_default.ogg] 音 100% 周 100% (0 チャンネル) 再生 / 遅延:0フレーム
| |■動作指定:このイベント / 上向 / ウェイト 2フレーム / 右向 / ウェイト 2フレーム / 左向 / ウェイト 2フレーム / 下向 / すり抜けOFF
| |■変数操作: CSelf4 = 0 + 0
| |■
|◇分岐終了◇
|■イベント処理中断
|■
◇分岐終了◇


記事No: 21506
タイトルRe: 範囲内に入ると反応する自動ドアのようなイベントをコモンで作りたい
投稿日: 2023/03/09 06:49
投稿者猫大好き [rWidrF569(海外)]

> ■ウェイト:1フレーム
> を設定すると、マップイベントが主人公の方を向いてしまうので、全て削除した良いです。
>
> 範囲外に出る時の処理は、セルフ4が1以上の時だけ実行するようにした方が良いです。
> ■条件分岐(変数): 【1】 CSelf16 が CSelf10 以上 【2】 CSelf17 が CSelf11 以上
> -◇分岐: 【1】 [ CSelf16 が CSelf10 以上 ]の場合↓
> |■条件分岐(変数): 【1】 CSelf4 が 1 以上
> |-◇分岐: 【1】 [ CSelf4 が 1 以上 ]の場合↓
> | |■サウンド:SE ファイル[SE/[System]Get1_default.ogg] 音 100% 周 100% (0 チャンネル) 再生 / 遅延:0フレーム
> | |■動作指定:このイベント / 上向 / ウェイト 2フレーム / 右向 / ウェイト 2フレーム / 左向 / ウェイト 2フレーム / 下向 / すり抜けOFF
> | |■変数操作: CSelf4 = 0 + 0
> | |■
> |◇分岐終了◇
> |■イベント処理中断
> |■
> -◇分岐: 【2】 [ CSelf17 が CSelf11 以上 ]の場合↓
> |■条件分岐(変数): 【1】 CSelf4 が 1 以上
> |-◇分岐: 【1】 [ CSelf4 が 1 以上 ]の場合↓
> | |■サウンド:SE ファイル[SE/[System]Get1_default.ogg] 音 100% 周 100% (0 チャンネル) 再生 / 遅延:0フレーム
> | |■動作指定:このイベント / 上向 / ウェイト 2フレーム / 右向 / ウェイト 2フレーム / 左向 / ウェイト 2フレーム / 下向 / すり抜けOFF
> | |■変数操作: CSelf4 = 0 + 0
> | |■
> |◇分岐終了◇
> |■イベント処理中断
> |■
> ◇分岐終了◇

おっしゃる通りウェイトを全て削除し、範囲外に出る時の処理はCSelf4が1以上になった時になるよう変えてみたら、扉がガチャガチャしなくなりました!
凄い!ありがとうございます!
ただ、横を通り抜けた時に開きっぱなしになるのは変わらずでした……。
自分は他のコモンを改造したりとかして手をつけていないのでなにか悪さをしているとは思えないのですが、試しにこの制作中のこの自動ドア以外の自作コモンを削除し、挙動を確認してもやはり変わらず。
もしかして覚えてないだけでいじっちゃったかな?と思ってこの自動ドアのコモンを出力し一度ウディタをアンインストールして最新のものを再インストールしてからコモンを読み込み、挙動を確認しても変わらず横に横切る時だけ扉が開きっぱなしになってしまいます。
縦も横も開きっぱなしになるならいざ知らず、横だけ開きっぱなしになるのはもう私の問題解決能力の範疇を超えていて、原因すら思い浮かびません。
原因としては何が考えられるでしょうか?
もし宜しければ、引き続きお知恵を拝借させていただけたらと思います。


記事No: 21507
タイトルRe: 範囲内に入ると反応する自動ドアのようなイベントをコモンで作りたい
投稿日: 2023/03/09 22:33
投稿者YADO [LerLWW459(海外)]

> ただ、横を通り抜けた時に開きっぱなしになるのは変わらずでした……。
> 自分は他のコモンを改造したりとかして手をつけていないのでなにか悪さをしているとは思えないのですが、試しにこの制作中のこの自動ドア以外の自作コモンを削除し、挙動を確認してもやはり変わらず。
> もしかして覚えてないだけでいじっちゃったかな?と思ってこの自動ドアのコモンを出力し一度ウディタをアンインストールして最新のものを再インストールしてからコモンを読み込み、挙動を確認しても変わらず横に横切る時だけ扉が開きっぱなしになってしまいます。
> 縦も横も開きっぱなしになるならいざ知らず、横だけ開きっぱなしになるのはもう私の問題解決能力の範疇を超えていて、原因すら思い浮かびません。
> 原因としては何が考えられるでしょうか?
> もし宜しければ、引き続きお知恵を拝借させていただけたらと思います。


こちらの動作テストは、ウディタ[3.164]プロ版で、新規マップを作成し、扉のマップイベントと扉用のコモンだけを設定してテストしています。
▼マップイベントの設定
起動条件:プレイヤー接触
待機時アニメ:チェック無し
接触範囲拡張:X=6、Y=6
イベントコマンドは扉用のコモンを呼び出す設定のみ。

テスト結果は「範囲内に入ると扉が開く」「範囲外になると扉が閉じる」となり、縦とか横とか関係なく、扉に近付けば開きっぱなしになります。


「横だけ開きっぱなし」などはよく分からない状態ですね。

現状の処理は、範囲内(近い)か範囲外(遠い)かで処理されるので、横とか縦とかは関係ないはずです。

範囲外なのに扉が開く場合は、範囲外を処理する設定に何らかの問題があるはずです。


あと最初に書かれていたイベント設定は、手入力で書いたのでしょうか?

手入力だと入力ミスで実際のイベント設定とは異なる記載になる可能性があるので、
イベントコマンドの上で右クリック→「コマンド文→クリップボードへコピー」でコピーしたものを貼り付けて記載した方が良いでしょう。


記事No: 21508
タイトル一部解決しました!
投稿日: 2023/03/10 23:07
投稿者猫大好き [rWidrFd355(海外)]

> こちらの動作テストは、ウディタ[3.164]プロ版で、新規マップを作成し、扉のマップイベントと扉用のコモンだけを設定してテストしています。
> ▼マップイベントの設定
> 起動条件:プレイヤー接触
> 待機時アニメ:チェック無し
> 接触範囲拡張:X=6、Y=6
> イベントコマンドは扉用のコモンを呼び出す設定のみ。
>
> テスト結果は「範囲内に入ると扉が開く」「範囲外になると扉が閉じる」となり、縦とか横とか関係なく、扉に近付けば開きっぱなしになります。
>
>
> 「横だけ開きっぱなし」などはよく分からない状態ですね。
>
> 現状の処理は、範囲内(近い)か範囲外(遠い)かで処理されるので、横とか縦とかは関係ないはずです。
>
> 範囲外なのに扉が開く場合は、範囲外を処理する設定に何らかの問題があるはずです。
>
>
> あと最初に書かれていたイベント設定は、手入力で書いたのでしょうか?
>
> 手入力だと入力ミスで実際のイベント設定とは異なる記載になる可能性があるので、
> イベントコマンドの上で右クリック→「コマンド文→クリップボードへコピー」でコピーしたものを貼り付けて記載した方が良いでしょう。

お返事ありがとうございます。
お恥ずかしながら手入力以外に入力方法があるとは知らず、地道にポチポチ打っておりました。仰るとおりの方法でコピペしたのが次のものになります。


▼ 呼出元マップイベントと主人公の距離を算出
■変数操作+: CSelf10[接触範囲X] = このマップイベント の 接触範囲拡張X
■変数操作+: CSelf11[接触範囲Y] = このマップイベント の 接触範囲拡張Y
■変数操作+: CSelf12[呼出元X] = このマップイベント の X座標(精密)
■変数操作+: CSelf13[呼出元Y] = このマップイベント の Y座標(精密)
■変数操作+: CSelf14[主人公X] = 主人公 の X座標(精密)
■変数操作+: CSelf15[主人公Y] = 主人公 の Y座標(精密)
■変数操作: CSelf16[Evとの距離X] 絶対値= CSelf14[主人公X] - CSelf12[呼出元X]
■変数操作: CSelf17[Evとの距離Y] 絶対値= CSelf15[主人公Y] - CSelf13[呼出元Y]
▼ 接触範囲外なら「0」を返す(停止)
■変数操作+: CSelf0[マップEvID] = 現在のマップID
■条件分岐(変数): 【1】 CSelf16[Evとの距離X] が CSelf10[接触範囲X] 以上 【2】 CSelf17[Evとの距離Y] が CSelf11[接触範囲Y] 以上
-◇分岐: 【1】 [ CSelf16[Evとの距離X] が CSelf10[接触範囲X] 以上 ]の場合↓
|■条件分岐(変数): 【1】 CSelf4[起動/停止] が 1 以上
|-◇分岐: 【1】 [ CSelf4[起動/停止] が 1 以上 ]の場合↓
| |■サウンド:SE ファイル[SE/ドア開ける音.mp3] 音 100% 周 100% (0 チャンネル) 再生 / 遅延:0フレーム
| |■動作指定:このイベント / 上向 / ウェイト 2フレーム / 右向 / ウェイト 2フレーム / 左向 / ウェイト 2フレーム / 下向 / すり抜けOFF
| |■変数操作: CSelf4[起動/停止] = 0 + 0
| |■
|◇分岐終了◇
|■イベント処理中断
|■
-◇分岐: 【2】 [ CSelf17[Evとの距離Y] が CSelf11[接触範囲Y] 以上 ]の場合↓
|■条件分岐(変数): 【1】 CSelf4[起動/停止] が 1 以上
|-◇分岐: 【1】 [ CSelf4[起動/停止] が 1 以上 ]の場合↓
| |■サウンド:SE ファイル[SE/ドア開ける音.mp3] 音 100% 周 100% (0 チャンネル) 再生 / 遅延:0フレーム
| |■動作指定:このイベント / 上向 / ウェイト 2フレーム / 右向 / ウェイト 2フレーム / 左向 / ウェイト 2フレーム / 下向 / すり抜けOFF
| |■変数操作: CSelf4[起動/停止] = 0 + 0
| |■
|◇分岐終了◇
|■イベント処理中断
|■
◇分岐終了◇
■条件分岐(変数): 【1】 CSelf4[起動/停止] が 0 と同じ 【2】 CSelf4[起動/停止] が 1 以上
-◇分岐: 【1】 [ CSelf4[起動/停止] が 0 と同じ ]の場合↓
|▼ 接触範囲内で未起動なら「1」を返す(起動)
|■サウンド:SE ファイル[SE/ドア・閉める音.mp3] 音 100% 周 100% (0 チャンネル) 再生 / 遅延:0フレーム
|■動作指定:このイベント / 下向 / ウェイト 2フレーム / 左向 / ウェイト 2フレーム / 右向 / ウェイト 2フレーム / 上向 / すり抜けON
|■動作完了までウェイト
|■変数操作: CSelf4[起動/停止] = 1 + 0
|■
-◇分岐: 【2】 [ CSelf4[起動/停止] が 1 以上 ]の場合↓
|▼ 接触範囲内且つすでに起動しているなら「2」を返す(起動済み)
|■変数操作: CSelf4[起動/停止] = 2 + 0
|■
◇分岐終了◇


仰る通り近いか遠いかだけで判定されるはずでどうして横方向だけ駄目なのかさっぱりで……。
ですが、試しに仰っていたとおりに接触範囲拡張をX=6Y=6にしたら正常に反応しました!
私はX=3Y=3でやっていたのですが、確認したところ私の環境ではX、Yどちらかが3以下だと正常に反応しないようで、私はそこでドツボにはまっていたみたいです!
4×4以上にすれば正常に反応してくれるようなので、これ以上変に質問を長引かせるのも申し訳ないですし、このまま使用してみようと思います。
こんなつたない質問にも丁寧に答えていただき、とても助かりました。
本当にありがとうございました!