[過去ログ] 【ゲームエンジン】Unity初心者質問スレBuild3 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
18
(2): 名前は開発中のものです。 [sage] 2020/01/13(月) 08:38:58.13 ID:QiViT9Gr(1/12) AAS
Quaternion が難しすぎて滑らか回転の独自実装は無理だった…
ので Update() の中で Lerp を使うことにしたけど、
Lerp の終了判定はどうするの?
※speedは適当

// Z軸正方向
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, 0), speed * Time.deltaTime);

// Z軸負方向
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 180, 0), speed * Time.deltaTime);

// X軸正方向
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 90, 0), speed * Time.deltaTime);

// X軸負方向
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 270, 0), speed * Time.deltaTime);

上記の四つの処理の回転の終了判定が、それぞれ取りたい。
ちなみに以下では取れなかった。

// Z軸正方向
transform.rotation == Quaternion.Euler(0, 0, 0);

// Z軸負方向
transform.rotation == Quaternion.Euler(0, 180, 0);

// X軸正方向
transform.rotation == Quaternion.Euler(0, 90, 0);

// X軸負方向
transform.rotation == Quaternion.Euler(0, 270, 0);
20: 名前は開発中のものです。 [sage] 2020/01/13(月) 11:04:47.55 ID:QiViT9Gr(2/12) AAS
>>19
19(1): 名前は開発中のものです。 [] 2020/01/13(月) 10:48:51.44 ID:Rcgjsxsv(1/11) AAS
>>18
終了条件は何なんだ?
x軸だけまず考えてみよう
何度回転したら止まるのかな?
終了条件は Quaternion Lerp (Quaternion from, Quaternion to, float t);
from が to に達した時が終了条件。

Z軸正・負方向、X軸正・負方向の4方向で頼む。
初心者サイトではたいてい "解説された軸の条件" だけでは動くが、実践ではまるで使えない。

単純な話だよ、"プレイヤーを東西南北の方向に滑らかに正対させる"
そして、正対する動作が完了してから、次の動作を開始させたい。
この処理が聞きたいだけ。
25: 名前は開発中のものです。 [sage] 2020/01/13(月) 12:15:46.59 ID:QiViT9Gr(3/12) AAS
>>21
21(5): 名前は開発中のものです。 [] 2020/01/13(月) 11:46:21.42 ID:Rcgjsxsv(2/11) AAS
画像リンク

これ見て理解して
単純にLerpの事理解してないと思うけど、Time.deltaTime という浮動小数点を使っている以上90度にはならない
最後のprint文表示すると分かるけど永遠と89.xxxxxと表示される
インスペクタは省略表示だからそれに惑わされないように

それから同じオブジェクトで複数軸の回転を行うと当然ながら「Quaternion.Euler(0, 90, 0)」では取れないのは分かるよね?
素晴らしい! 教えてもらった方法で自分がやりたいことが完全に出来た!

4個処理を書いてたのは、プレイヤーがブロックのどの方向に接触したかで、
処理を分岐させる為で、同時に処理するわけではなかった。申し訳ない。

いや、マジでありがとう。本当に理解している人から教えてもらえて、すごく助かった。
32: 名前は開発中のものです。 [sage] 2020/01/13(月) 16:37:27.12 ID:QiViT9Gr(4/12) AAS
そもそもの質問がターゲットを追うじゃなくて、
"プレイヤーを東西南北の方向に滑らかに正対させる"
だよ。

で、>>21 の方法で求める処理が実装出来た、サンキュー!
33: 名前は開発中のものです。 [sage] 2020/01/13(月) 17:04:23.60 ID:QiViT9Gr(5/12) AAS
>>26
26(3): 名前は開発中のものです。 [sage] 2020/01/13(月) 13:00:01.95 ID:auL79zSW(1/4) AAS
>>21
単純にUnityのこと理解してないと思うんだけど
現在位置からターゲットに向ける用途的にはLerpでなくTowards使うんだぜ

transform.position = Vector3.MoveTowards(transform.position, target.position, moveSpeed * Time.deltaTime);
if(transform.position == target.position) // 移動完了処理

transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, rotSpeed * Time.deltaTime);
if(transform.rotation == target.rotation) // 回転完了処理
は質問の意味が理解できなかったんだね。スマンスマン。
"プレイヤーを東西南北の方向に滑らかに正対させる"
なので、Lerp が正解だ、RotateTowards では希望の動作にならない。

しかし皆ありがとう。理解するのにとても助けになった。
37: 名前は開発中のものです。 [sage] 2020/01/13(月) 18:42:06.51 ID:QiViT9Gr(6/12) AAS
>>36
36(1): 名前は開発中のものです。 [sage] 2020/01/13(月) 18:11:33.42 ID:auL79zSW(3/4) AAS
初心者に不正解扱いされて笑った

つまりレベル下げて書くとこういうことだろ?
transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(0, 90, 0), speed * Time.deltaTime);
if(transform.rotation == Quaternion.Euler(0, 90, 0)) // 処理

>>18の Lerp を RotateTowards に置き換えればそのまま動くんだよ
それをターゲットがあるとか無いとか初心者ならともかくドヤ顔でレスしてるID:Rcgjsxsvが言い出すのは素人感出し過ぎだぜ
まあ初心者が答えるスレっぽくて俺は嫌いじゃないが
ん? それでは動かないぞ。今試した。

>>21 の方法なら動いたけどな、確かに>>21の言う通り浮動小数点を理解出来てないっぽいね。

自分は Unity初心者で、初心者スレで訪ねてるんだから、>>21 のように、
わざわざコードを自分で書いて、動くか試してから教えてくれる人に本当に感謝したい。

まあ、間違って動かないコードもそれなりに参考になるからサンキュー!
39: 名前は開発中のものです。 [sage] 2020/01/13(月) 18:59:30.16 ID:QiViT9Gr(7/12) AAS
まず >>26ID:auL79zSW
"現在位置からターゲットに向ける用途的にはLerpでなくTowards使うんだぜ" と言ってるのが、>>15
15(2): 名前は開発中のものです。 [sage] 2020/01/12(日) 21:58:52.24 ID:6ETev4FX(1/2) AAS
Lerp() と Slerp() で滑らかにオブジェクトを回転させたいんだけど、FixedUpdate() 内で使ったら、
それらの回転の終了を知るにはどうするんだろう?

FixedUpdate() 内であるタイミングで滑らかに回転してから次の処理を走らせたい。

そもそも 連続するフレーム内での Lerp() と Slerp() の使い方がわからない。
初心者サイト見ても、FixedUpdate() 内で動的に開始と終了ベクトルを指定するサンプルとかがない。

実践的にはどう使うの? それとも UniRXとか使うの?
からの質問の文脈を無視してるね。

で、>>27
27(1): 名前は開発中のものです。 [] 2020/01/13(月) 13:52:22.60 ID:Rcgjsxsv(5/11) AAS
>>26
ターゲットあるならLookat の方が全然いいんだぜ

って、なやり方なんか色々あるのやで
初心者スレなのよここ
ID:Rcgjsxsv
”ターゲットあるならLookat の方が全然いいんだぜ” と言っているのは >>26 でターゲットと出てきたからだ。人の話を聞いてそれに反応してるんだよね。

でも、ドヤ顔して教えてくれて全然かまわないんだ。Unity初心者でも参考になる情報とそうではない情報の区別はつくから。
というか、自分の質問で争いになって申し訳ない気持ちだ。皆さんどうもありがとう。
42: 名前は開発中のものです。 [sage] 2020/01/13(月) 20:15:44.52 ID:QiViT9Gr(8/12) AAS
質問スレなんで、質問に対する解決策の提案が出来なければ、誰にも感謝されないよ。
仮に、提案が間違っていても問題ない。一緒に考えてくれることがとてもありがたい。

教えてくれて本当にありがとう。
46
(2): 名前は開発中のものです。 [sage] 2020/01/13(月) 21:32:16.53 ID:QiViT9Gr(9/12) AAS
質問いいかな?

マリオ64+初代トゥームレイダーみたいな3Dアクション作ってるんだけど、
スマホ画面のバーチャルボタンでの二つボタン同時押しがきつい。
例えば、Bダッシュジャンプ(※B押しながらAでジャンプ)とかが出来ない。

そこで物理コントローラでの操作はそのままで、例えばスマホ画面の
バーチャルコントローラだけ、Bボタンを "離す入力" を遅延させることは出来ないかな?

例えばスマホではBボタンを離しても、0.5秒は押したままで判定されて、その隙にAボタンを押すみたいな。

スクリプト内では以下でコントローラの入力を取ってる。
UnityEngine.InputSystem.Controls.ButtonControl

自分が思いつくのは拡張メソッドとか?
スマホ判定したら、特定のボタンの wasReleasedThisFrame が来たら、何とかして遅延実行させるとか?
48: 名前は開発中のものです。 [sage] 2020/01/13(月) 22:06:33.65 ID:QiViT9Gr(10/12) AAS
>>47
47(1): 名前は開発中のものです。 [] 2020/01/13(月) 21:46:07.74 ID:Rcgjsxsv(11/11) AAS
>>46
さーせん自分インプットシステムようわからんので
ここは自称中級者君と糖衣構文君が動くコード書いて説明してれることを祈る
いえいえ、いつもありがとう。

スクリプトでは例えば以下のように書いてるけど(※例えばYボタン)
if (yButton.wasReleasedThisFrame) {
// 処理
}

物理コントローラー接続時とスクリプトを変えたくないとしたら、
yButton.wasReleasedThisFrame の前に処理をインターセプト出来て、
本来の wasReleasedThisFrame が来たら 10フレ遅らせて wasReleasedThisFrame を発火させるとか。

なら、UnityEngine.InputSystem.Controls.ButtonControl を継承した自作クラスを作るとか?
そんな入力イベントをバッファ出来る自作ボタンコントロールクラスとか出来るのかな?
49: 名前は開発中のものです。 [sage] 2020/01/13(月) 22:39:53.81 ID:QiViT9Gr(11/12) AAS
とりあえず進捗

以下のようなクラスの継承では動かなかった。
public class BufferButtonControl : ButtonControl {
  // 処理を書く予定だった
}

無理やりキャストして ButtonControl 型の変数に突っ込もうとしたが、Unity で実行時エラーが出た。
yButton = (BufferButtonControl ) Gamepad.current.yButton;

しかし拡張メソッドは動いた。
public static bool WasReleasedThisFrame(this ButtonControl self) {
  Debug.Log("Hack!");
  return self.wasReleasedThisFrame;
}
あとはこの中にスマホで物理コントローラ接続無しなら、10フレ程度バッファする処理を書けば…
って、どう書くんだろう?
52
(1): 名前は開発中のものです。 [sage] 2020/01/13(月) 23:13:16.61 ID:QiViT9Gr(12/12) AAS
>>50
50(1): 名前は開発中のものです。 [sage] 2020/01/13(月) 22:40:12.07 ID:yBWGUThF(2/3) AAS
そんな処理より、操作変えた方がいいよ。
ボタン二つを管理するのかな?と思ったけどそうじゃなくて遅延させるのはちょっと…
どうしてもやりたいなら、タッチマネージャーを頭から作るのが必要かと。
アドバイスありがとう。
タッチマネージャーを自作が良さげでいいのかな。

うーん、もともと ”このゲームは必ず物理コントローラを接続して下さいキリッ!” っていこうとしてたけど、
流石にそんな物理コントローラ用意するコアな人達は1%もいないと思い、スマホ画面上にボタン表示して自分で
動作テストしたけど、当然とても操作が難しかった。

でも、自分的にはスマホ的なタッチ操作はまだ考えてなくて、あくまでスーパーファミコン的な操作でやりたいと思ってる。
で、ボタンを離す動作の遅延処理を思いついたという流れ。

上に書いたように拡張メソッド自体は動くので、何とかバッファ処理出来ないかなと…
スマホ画面でBダッシュジャンプを実装したいなあ…
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.033s