🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3877閲覧

同じ座標に重なったとき、rotationの値が0と180,-180を行き来しくるくるしてしまうのをどうにかしたい

torisva

総合スコア23

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/12/15 17:10

前提・実現したいこと

前提 FromToRotationを使ってオブジェクトの向きを決めるスクリプト

[SerializeField] Transform TargetObject; //向きたい方向 void Update() { Vector3 relativePos = TargetObject.position - transform.position; transform.rotation = Quaternion.FromToRotation(Vector3.up,relativePos); //+y軸を向きたい方向へ向ける }

TargetObjectはこのオブジェクトにAddForceを使ってどんどん近づいてきます

そのTargetObjectとこのオブジェクトが重なったとき
このオブジェクトがくるくると回転してしまいます(表示は0と180または-180が交互に表示されます)

180.-180にならず、
少しぶれるくらいならいいのですが
重なったときにその場で回転したりせず最終的には0でぴったり止まってほしいです。
どうすればよいでしょうか? よろしくお願いします

ちなみにこのオブジェクトも動きます。それをTargetObjectが追いかけてきます

試したこと

Rigidbody.AddTorqueとか使えば急に0と180を行き来することはなくなるはずと思い、
Rigidbodyをアタッチ

rb.MoveRotation(Quaternion.FromToRotation(Vector3.up, TargetObject.position)); //結果は同じになるとは思っていたけどとりあえず試してみたもの //同じどころか全然TargetObjectの座標とは違うほうに回ってしまった(凡ミス) rb.MoveRotation(Quaternion.FromToRotation(Vector3.up, relativePos)); //結果はしっかりTargetObjectのほうを向くけど重なったとき前提に書いたものと同じく急に角度が変わる //予想通りではあった rb.AddTorque(relativePos); rb.AddRelativeTorque(relativePos); //全然違う方向に回りだし、重なっても回り続け、しばらくすると止まる //そもそも相手の方角を示しているrelativePosを力にしても相手のほうを向いてくれない rb.AddRelativeTorque(-relativePos); //TargetObjectから離れるように、TargetObjectのほうを向かないように真逆に動いている気がしたから //結果は逆回転し始めただけでTargetObjectから離れるように動くことは変わらず float Angle = Vector3.Angle(transform.position, TargetPosition.position); //二点間の角度を教えてくれる、でも返ってくるのはfloat、 //Vector3じゃないとAddTorqueには入れられない

このオブジェクトとTagetObjectの角度はわかっても、それをどうAddTorqueに
入れればいいのかわからない

TargetObjectのほうへ向く力はどうすれば求められるのか、

TargetObjectと重なれば力を0にすればいいということはわかるけど
重なったかどうかの判定はどうすればいいのかわからない(if文とVector3.Distanceを使う?)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このオブジェクトの位置とTargetObjectの位置が極端に近づくとrelativePosの大きさが非常に小さくなり、向きの誤差が大きくなって異常な動きを誘発しそうですね。
AddTorque系メソッドを使ってみようという発想も面白いと思いますが、ここは単純に両者の距離が十分近い場合は向き合わせ処理を行わないようにするだけでいいんじゃないでしょうか。
ついでに、再び両者の距離が離れて向き合わせを再開したときに急激に新しい方向へ向いてしまうのを防止するため、「Unity3D LookAt関数でどのベクトルをTargetに向けるか指定したい」の質問文でご提示いただいたQuaternion.Slerpによるスムージングも組み込んでやるといいかもしれません。

C#

1[SerializeField] 2Transform TargetObject; //向きたい方向 3 4// 最新の目標回転を覚えておくためのフィールドを追加する 5Quaternion targetRotation = Quaternion.identity; 6 7float sqrMagnitudeThreshold = 0.1f * 0.1f; 8float speed = 0.1f; 9 10void Update() 11{ 12 Vector3 relativePos = TargetObject.position - transform.position; 13 14 if (relativePos.sqrMagnitude > sqrMagnitudeThreshold) 15 { 16 // relativePosがある程度大きいときだけtargetRotationを更新する 17 // relativePos.magnitudeを調べて判定を行ってもいいのですが、この手の距離判定では 18 // 2乗距離を使うことで内部的に行われる平方根計算を1回節約するテクニックがしばしば 19 // 使われるため、せっかくなのでそのようにしてみました 20 // とはいえ、1フレームに一回の頻度なら大して有効性は感じられないと思います 21 targetRotation = Quaternion.FromToRotation(Vector3.up, relativePos); 22 } 23 24 // Slerpを使って現在の回転と目標回転を混合し、混合結果を新しい向きとする 25 transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed); 26}

追記
非常にわかりやすい映像で参考になりました。
Vector3.upを真逆の方向であるVector3.downに向けて回すとき、その軌道がY軸周りのどの方角を経由するかは曖昧です。たとえ話として、もし地球が海も山もないなめらかな球体で今北極点に立っているとすると、そこから最短の経路で南極点へ行けと言われたときに、どの方角へ歩き始めても距離は同じです。ですが最終的に南極点へ到達して立ち止まったとき、自身のY軸周りの向きは選んだ経路によって変わってくるはずです。
この状況と似たような現象が起こっており、南極点付近だと目標地点がわずかにずれただけでも選択される最短経路が大きく変わり、最終的なY軸周りの向きがころころ変化してしまうのだろうと考えられます。

改善案として「初期の頭の方向(Vector3.up)ではなく、現在の頭の方向(transform.up)から目標方向(relativePos)への回転を求め、それを現在の姿勢(transform.rotation)に上書きするのではなく追加適用する」というのはどうでしょうか?
言葉で説明するとややこしくなってしまいすみませんが、下記のような回転方法ではどうでしょうか。

C#

1[SerializeField] 2Transform TargetObject; //向きたい方向 3 4// 目標回転に代わって、目標方向を覚えておくようにする 5Vector3 targetRelativePos = Vector3.up; 6 7float sqrMagnitudeThreshold = 0.1f * 0.1f; 8float speed = 0.1f; 9 10void Update() 11{ 12 Vector3 relativePos = TargetObject.position - transform.position; 13 14 if (relativePos.sqrMagnitude > sqrMagnitudeThreshold) 15 { 16 targetRelativePos = relativePos; 17 } 18 19 // 現在の頭の向き、つまりtransform.upをtargetRelativePos方向に向ける回転を求め... 20 Quaternion relativeRotation = Quaternion.FromToRotation(transform.up, targetRelativePos); 21 22 // 目標姿勢は現在の姿勢に上記の相対回転を適用した姿勢とする 23 Quaternion targetRotation = relativeRotation * transform.rotation; 24 25 transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed); 26}

追記
transform.eulerAngles.yを毎回0に書き換えるという方法だと、書き換え後のtransform.upの方向は本来の向きからずれてしまうかと思います。ですが今回の場合では「向きを目標方向に近づける」→「オイラー角のYだけを0に書き換える」→「向きを目標方向に近づける」→「オイラー角のYだけを0に書き換える」...というプロセスをわずかずつ何度も繰り返すことによって、全体の連続性は保たれそうな感じです。ですので、そのやり方で問題がなさそうでしたらOKかと思います(後述しますが、本当にそのやり方でも全方向完璧に自然な回転を実現できるのかどうか不安はあるのですが...)。

私の方でも何かY回転を0にする手がないか考えてみようと思い、下記のようなやり方を試してみました。前回同様にY周り角度の制限なしで向きを設定したあと、transform.upの向きを維持したままY角度を0にした回転に置き換えています。

C#

1[SerializeField] 2Transform TargetObject; //向きたい方向 3 4Vector3 targetRelativePos = Vector3.up; 5readonly float sqrMagnitudeThreshold = 0.1f * 0.1f; 6readonly float speed = 0.1f; 7 8void Update() 9{ 10 Vector3 relativePos = TargetObject.position - transform.position; 11 if (relativePos.sqrMagnitude > sqrMagnitudeThreshold) 12 { 13 targetRelativePos = relativePos; 14 } 15 Quaternion relativeRotation = Quaternion.FromToRotation(transform.up, targetRelativePos); 16 Quaternion targetRotation = relativeRotation * transform.rotation; 17 transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed); 18 19 // まず、元のローカル回転を使ってVector3.upを回したときにどの方角を向くかを求める 20 Quaternion oldRotation = transform.localRotation; 21 if (oldRotation.w < 0.0f) 22 { 23 oldRotation = new Quaternion(-oldRotation.x, -oldRotation.y, -oldRotation.z, -oldRotation.w); 24 } 25 Vector3 localUp = oldRotation * Vector3.up; 26 27 // localUpの各成分をもとにZ回転・X回転だけで同じ方向に向けるための角度を算出する 28 // このとき、Z角度を-90°~90°の範囲で設定するパターンと... 29 float phi1 = Mathf.Asin(Mathf.Clamp(-localUp.x, -1.0f, 1.0f)) * Mathf.Rad2Deg; 30 float theta1 = Mathf.Atan2(localUp.z, localUp.y) * Mathf.Rad2Deg; 31 Quaternion newRotation1 = Quaternion.Euler(theta1, 0.0f, phi1); 32 if (newRotation1.w < 0.0f) 33 { 34 newRotation1 = new Quaternion(-newRotation1.x, -newRotation1.y, -newRotation1.z, -newRotation1.w); 35 } 36 37 // Z角度を-180°~-90°、90°~180°の範囲で設定するパターンが考えられるが... 38 float phi2 = -180.0f - phi1; 39 float theta2 = -180.0f + theta1; 40 Quaternion newRotation2 = Quaternion.Euler(theta2, 0.0f, phi2); 41 if (newRotation2.w < 0.0f) 42 { 43 newRotation2 = new Quaternion(-newRotation2.x, -newRotation2.y, -newRotation2.z, -newRotation2.w); 44 } 45 46 // なるべく元の回転に近い方を採用する 47 Quaternion newRotation = 48 Quaternion.Dot(oldRotation, newRotation1) >= Quaternion.Dot(oldRotation, newRotation2) 49 ? newRotation1 50 : newRotation2; 51 transform.localRotation = newRotation; 52}

動きは下図のようになりました。回転が2つの軸の角度だけに支配されていることを視覚的にわかりやすくしようと思い、二軸ジンバルをイメージした台を置いてみました。

図

補足しますと、動かしている最中にインスペクターを観察するとY回転がちょくちょく180°回転してしまうかと思います。回転生成自体はQuaternion.Euler(theta1, 0.0f, phi1)といった具合にYが0になっているのですが、クォータニオンとオイラー角の相互変換をする上でのいたしかたない都合でこんなことになってしまいます(以前別の方の「[Unity] オブジェクトのRotationの値を変化させたときの挙動について質問」という件でもちょっと申し上げたことがありました)。

やってみた感想としては、だいたいの場合ではそれらしい見栄えになったものの、たまに姿勢がピョンと飛んでしまうことがあって不満が残りました(図の最後の方で-X方向に向けたときに顕著な飛びが起こっています)。これを解消しようとスムージングをかけたりするとピクピク現象を起こしてしまったりして、一筋縄ではいかなそうです。
今回のように軸の回転を制限したり、あるいはご質問者さんのtransform.eulerAngles.y書き換えによる回転固定を行うと姿勢の自由度が低下してしまって、どこかしらの方角で姿勢の急激に変化する特異点的な場所が発生するのは避けられないんじゃないかと思います。

投稿2019/12/15 21:43

編集2019/12/19 18:02
Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torisva

2019/12/16 04:17

メモ Vector3.magnitude…ベクトルの平方根の長さを返す(√x, √y, √z) Vector3.sqrmagnitude…ベクトルの二乗の長さを返す(x*x, y*y, z*z) Quaternion.identity…[回転していない]状態、transform.rotationに入れるとrotationは(0,0,0)になる Quaternion.Slerp…回転版球状補完 └Vector3.Slerp…方向版球状補完 理解しようとして時間がかかりました(理解できたわけではない) とりあえずまだ問題点があります 最終的にはしっかりと止まってくれますが、止まってくれるまでの時間が長いです、 数秒ピクピクした後に止まります relativePosがある程度大きいとき、つまりTargetObjectと自身の距離がある程度離れているときに更新されるということなので Debug.Log(relativePos.sqrMagnitude + " , " + sqrMagnitudeThreshold); と記述し止まった時の数値を見てみたのですが (0.13付近の数値 , 0.01)とコンソールに表示されます 疑問1(何でrelativePosのほうは0じゃないんだろう) 疑問2(どうしてベクトルの2乗がVector3ではなく、floatで返ってきてるんだろう (3,3,3)のベクトルがあったら2乗して(9,9,9)が返ってくるわけじゃないのはなぜか) relativePosの数値が 0.01 より小さくならないため、常に更新しているのだと思い sqrMagnitudeThresholdの値を増やしてみたのですが、 今度は十分に近づけていないのに止まります sqrMagnitudeThresholdの値はrelativePos.sqrMagnitudeより小さいと十分に近づける でも十分に近づいているとしてもピクピクしていて止まるまでに時間がかかる 止まった時のrotationの値はしっかりと(0,0,0)になっています ぴくぴくしているとき positionが動くようなスクリプトではないはずなのにとても小さな数字で動いています sqrMagnitudeThresholdの値はrelativePos.sqrMagnitudeより大きいと十分に近づかない でもしっかりすぐさま止まってくれる という状態です Quaternion.Slerpというのもあまりピンときません(回転ベクトルの球状補完ってどんなイメージですか?) Vector3.Slerpだと何となく球状補完の意味がイメージできるのですが 丸投げはあまり好きではないのですが、これに関しては一人ではどうすればよいのかわかりません わからないところは全部出していこうと思ったので長文になってしまいました 答えるのが面倒だと思ったところは飛ばしてもらって構いませんので よろしくお願いします
Bongo

2019/12/16 06:48

何だかベクトルの長さに関する解釈が怪しげな気はしますが、それはともかくとしてピクピク現象が気になりますね... のちほど改善できないか検討してみようと思いますが、参考情報としておうかがいします。 まず「このオブジェクト」にはご質問者さん自身での方法検討の際にRigidbodyをアタッチしたかと思いますが、それはまだは付いているでしょうか。 また、この回転スクリプト以外に何かオブジェクトの回転に作用しそうな部分の心当たりはあるでしょうか(ご自身では関係あるかどうか判断しかねるようでしたら、オブジェクトのスクリプトを省略なしで丸ごとご提示いただくというも私はかまいません)。 それと欲を言えば...なのですが、そのピクピク現象の様子を動画としてお見せいただけると手がかりになりそうです。ですが静止画と違って手間がかかるかもしれませんので、代わりにTargetObjectの追いかけスクリプトの内容と、TargetObjectにアタッチしてあるRigidbodyのインスペクターの画像をご提示いただけないでしょうか。
torisva

2019/12/16 20:29

「このオブジェクト」にはRigidbodyはついていません、親子関係にあるオブジェクトにもすべてRigidbodyはついていません https://youtu.be/WxRTBEayDAQ ピクピクする挙動およびプロジェクトの詳細の動画です 動画の後半、スクリプトを載せた後の内容ですが、 どうしてこんな変な回転をするんでしょうか? 調べても今のQuaternion.Slerpでは思った通りの回転はしないということがわかっても、 対処法まではわかりませんでした。 スクリプトを考え、ここに書き込むのは面倒かもしれません。 (もちろん答えを書いていただけたらそこから自分の知識にできるように読み解こうと思います) ですので どういう考え方をしたら、正しい回転にできるのかを教えてほしいです 例)Qキーを入力したらジャンプしたい A1.キーを入力したかを判定する(if文) 2.入力していた場合、上に力を加える(AddForce) といったかんじに文章で教えていただけるだけでもとても助かります お時間いただいて申し訳ないのですが よろしくお願いします。
torisva

2019/12/16 20:34

スクリプト書き忘れていたので *********************************************** //ばねのスクリプト [SerializeField] Transform Target; [SerializeField] Rigidbody rb; float FP = 2f; float rbdrag; void Start() { rbdrag = rb.drag; } void Update() { AddSpringForce(Target.position, rbdrag); } void AddSpringForce(Vector3 TargetPosition, float r) { Vector3 diff = TargetPosition - transform.position; Vector3 Force = diff * r; rb.AddForce(Force * FP); } *************************************************** //特定の座標を見続けるスクリプトです [SerializeField] Transform TargetObject; //向きたい座標 Quaternion targetRotation = Quaternion.identity; float sqrMagnitudeThreshold = 0.1f * 0.1f; float speed = 0.1f; void Update() { Vector3 relativePos = TargetObject.position - transform.position; if (relativePos.sqrMagnitude > sqrMagnitudeThreshold) { targetRotation = Quaternion.FromToRotation(Vector3.up, relativePos); } transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed); } ***************************************************
Bongo

2019/12/16 22:19 編集

動画まで用意していただきましてありがとうございます。映像で見ると異常ぶりが一目瞭然ですね... 回転方法の代案を考えてみましたが、これならどうでしょうか? ※補足 先のコメントで「ベクトルの長さに関する解釈が怪しげ」と申し上げましたが、relativePos.sqrMagnitudeというのはこのオブジェクトの位置とターゲットの位置をまっすぐ結ぶ線の長さの二乗で、Vector3型ではなくfloat型です。これの平方根がrelativePos.magnitudeであり、同じくfloat型となります。「ひとつのオブジェクトから別のオブジェクトへの向きと距離 - Unity マニュアル」(https://docs.unity3d.com/ja/current/Manual/DirectionDistanceFromOneObjectToAnother.html )あたりの記事がご参考になるでしょうか。 Quaternion.Slerpの理屈については、これはVector3.Slerpの4次元バージョンと考えればいいかと思います。Quaternion型はx、y、z、wの4成分でできていますが、これは4次元ベクトルと見なすことができます。特に回転用のクォータニオンの場合はその長さが1.0になるようになっており、半径1.0の4次元の球体(三次元単位球面...https://ja.wikipedia.org/wiki/%E4%B8%89%E6%AC%A1%E5%85%83%E7%90%83%E9%9D%A2 )の上の1点を示していると考えられます。ここで2つの点を最短経路で結ぶようにSLERPを行うと、経路上の点は2つのクォータニオンが表す姿勢を自然に混ぜ合わせた姿勢を表します。 この辺の話は「クォータニオンと回転 - エフアンダーバー」(https://www.f-sp.com/entry/2017/06/30/221124#%E3%82%AF%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%8B%E3%82%AA%E3%83%B3%E3%81%AE%E8%A3%9C%E9%96%93 )の解説がわかりやすいかと思います。ですがまあ実際に使う上では詳しい理屈まで立ち入らなくても、「2つの姿勢をいい感じに混ぜ合わせて、中間の姿勢を生成するものだ」と思っていただければ十分なんじゃないでしょうかね?
torisva

2019/12/17 14:02

ピクピクは直ったため最初の質問とは異なる質問になりますが、 こちらにも答えていただけないでしょうか? 質問 常にy軸の回転は0にしたい (最後のほうに書きましたが、プログラムを追記したことで 今のところは理想通りの結果が得られていると思っています、 そのうえで質問しています) メモ 三次元球面 = 超球面…点が集まってできた球体みたいなもの、        一つの半径rの球では表面のみで中身には点は詰まっていない        (3Dモデルのメッシュみたいなもの?) Quaternion.Slerp …超球面上を通るように最短距離で一定速度で補間をしてくれる Quaternion * Quaternion…計算結果はよくわからないが、              二回の回転を一回の回転に合成してくれる              順番が異なると計算結果が異なり、unityでは右に記述したQuaternionから              処理した結果を一回の回転に合成してくれる 試したこと Unityのマニュアルから引き算の後、yを0にすると容易に得られるとあったので一応試す relativePos.y = 0; 案の定、よくわからない挙動になる relativePos.x = 0; relativePos.z = 0; それぞれ別々に試したが xのほうはz軸が回ってくれなくなり、zのほうはx軸が回ってくれなくなる あとがき すみません、何も調べずに質問したくはなかったので、返信に時間がかかってしまいました いただいたリンクはしっかり目を通させていただきましたが(Wikipediaはあまり見れていませんが) それをどうやって現状起こっている問題にいかすのかまで頭が回りません Slerpの中身は(自身の回転から, 目標回転値と自身の回転の合成まで, speedの速さで補間) となっていると解釈していますが どう変更したら常にy座標を0にする回転を得られるのかわかりませんでした ******************************************* 無理やりな気がしますが以下の記述を最後に追加することで transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, 0f, transform.localEulerAngles.z); y座標を0にし、今のところは理想通りの結果が得られているのかな?と思います これは正しいでしょうか? (プログラムに正しいも何もないとは思いますがBongoさん的にはどう思われるかなど聞きたいです) ********************************************* 以上、とっちらかった返信でした 次のBongoさんの返信で何も問題がなさそうならベストアンサーにして 質問を終わらせようと思っています よろしくお願いします。
Bongo

2019/12/19 17:55 編集

お返事が遅くなりすみません。そのうえ、お時間をいただいたにもかかわらずいまいちご希望にかなうような成果は得られませんでした... transform.eulerAngles.y書き換え方式で特に問題なさそうならいいのですが、どうも「ピクピク現象(または姿勢の飛び)を起こさない」と「Y軸回転を常に0にする」を両立させるのは難しそうです。どちらかはあきらめていただくか、あるいは未実験ですが妥協案として「まずY軸回転無制限ですばやく目標方向を向かせ、同時にY回転を0にした場合の姿勢も内部的に求めておき、Y軸回転無制限姿勢からY軸回転0姿勢へ十分ゆっくり遷移させる」ということも可能かもしれません(いわばピクピク現象を見た目が不自然にならない程度に穏やかに発生させるイメージです)。 「十分ゆっくり遷移させる」という部分に関しては、今回のコード中で使っているような単純なSlerpだと動き出しが急激すぎて、第3引数を小さくするだけではきれいにいかないような気がします。もっと複雑なコントロール...たとえば「目標姿勢へ向かうようトルクをかけ、同時に角速度に比例した回転抵抗をかける(バネ・ダンパーモデル(https://ja.wikipedia.org/wiki/%E6%B8%9B%E8%A1%B0%E6%8C%AF%E5%8B%95 )の回転バージョンみたいなもの)」が必要じゃないでしょうか。 この辺のやり方は別の方のご質問「ベクトルやAddTorqueに関して。」(https://teratail.com/questions/201674 )で挙げさせていただいた「【Unite Tokyo 2018】誘導ミサイル完全マスター」(https://youtu.be/t_4MbV2zIwg?t=713 )とか「【Unite 2017 Tokyo】スマートフォンでどこまでできる?3Dゲームをぐりぐり動かすテクニック講座」(https://youtu.be/6EtTI5xC524?t=1930 )の技法が使えるかもしれません。
torisva

2020/03/21 15:15

すみません、長いことログインしていなくていまさらになりますが、 本当にご協力ありがとうございます。 現在、自作ゲームがもうすぐ完成するところまで来ていますので、 本当にあなた様の協力があってこそです 感謝してもしきれないほどです、ありがとうございます。 unity公式の講座や、ご提示いただいた誘導ミサイルなどはすでに何度も見ていますが、 なかなか自分のものにできず申し訳ないです(記憶に入れておくこともできない(すぐ忘れるなど)) 追記も見させていただきました。 また回転で悩むことがあったり、今の妥協スクリプトを改善しようと思った場合に 参考にさせていただこうと思います 長い時間、ありがとうございました。無駄にならないよう頑張りたいと思います。
Bongo

2020/03/21 23:03

ご丁寧にありがとうございます。順調に進捗しているご様子で、私としても喜ばしいです。応援しております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問