質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.51%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Unity

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

Q&A

1回答

5778閲覧

再度質問させていただきます。Unity 動く床について

van-0215

総合スコア89

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Unity

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

0グッド

1クリップ

投稿2016/03/25 01:48

編集2022/01/12 10:55

前回の質問に続きUnity5について質問させていただきます。

現在動く床を作成しています。 その際、プレイヤーが床に乗ったらともに動く。という使用にしているのですが、横方向での動作は確認できたのですが、縦方向では画像のようにキャラクターがたまに浮いてしまいます。
浮いたキャラクター

下記に動く床(床自体が上下に動く)のスクリプト。
そしてキャラクターを連動して動かすスクリプト。(こちらは、床の上にColliderを作り床の上にプレイヤーがきたら、床の子オブジェクトにキャラクターを入れる。という仕様です)
この2つを貼っておきます。どうすれば床の上で浮かないでいられるか教えてください。 お願いします。

今色々試してみましたが、子の床に乗った後に↑を使っての移動時には浮かないことがわかりました。 十字キーの→↓←を押すと浮いてしまいます。 一度浮いたら基本的に浮きっぱなしです。

C#

1<動く床> 2using UnityEngine; 3using System.Collections; 4 5public class MoveFloor_tate : MonoBehaviour 6{ 7 8 private Vector3 initialPosition; 9 10 void Start() 11 { 12 13 initialPosition = transform.position; 14 15 } 16 17 void Update() 18 { 19 20 transform.position = new Vector3(initialPosition.x, initialPosition.y + Mathf.Sin(Time.time) * 2.0f , initialPosition.z); 21 22 } 23 24}

C#

1<プレイヤーを連動させる> 2using UnityEngine; 3using System.Collections; 4 5public class MoveFloor_player_tate : MonoBehaviour 6{ 7 8 void OnTriggerEnter(Collider other) 9 { 10 Debug.Log("TriggerEnter"); 11 if (other.gameObject.tag == "Player")//プレイヤーが乗った 12 { 13 if (other.gameObject.transform.parent == null)//親子設定がない 14 { 15 **other.gameObject.GetComponent<Rigidbody>().isKinematic = true; /*isKinematicをONに*/** 16 other.gameObject.transform.parent = transform;//親子を設定 17 Debug.Log("parenting"); 18 } 19 } 20 } 21 22 void OnTriggerStay(Collider other) 23 { 24 Debug.Log("TriggerStay"); 25 } 26 27 void OnTriggerExit(Collider other) 28 { 29 Debug.Log("TriggerExit"); 30 if (other.gameObject.tag == "Player") 31 { 32 if (other.gameObject.transform.parent != null) 33 { 34 ** other.gameObject.GetComponent<Rigidbody>().isKinematic = false;/*isKinematicをOFFに*/** 35 other.gameObject.transform.parent = null; 36 Debug.Log("unparenting"); 37 } 38 } 39 } 40} 41

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

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

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

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

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

sakura_hana

2016/03/25 02:11

1.Debug.Logは想定通りのタイミングでTriggerEnterとTriggerExitが表示されていますか?  2.プレイヤーのオブジェクトにはRigidbodyコンポーネントが付いていると思いますが、「Use Gravity」と「Is Kinematic」の項目はどんな設定にしていますか?
van-0215

2016/03/25 02:29

1.Debug.Logは想定通りのタイミングでTriggerEnterとTriggerExitが表示されていますか? >>想定通りのタイミングかつ表示もしっかりされています。(浮いているときも表示はされている) 2.プレイヤーのオブジェクトにはRigidbodyコンポーネントが付いていると思いますが、「Use Gravity」と「Is Kinematic」の項目はどんな設定にしていますか? >>「Use Gravity」はON。「Is Kinematic」はOFFです。
guest

回答1

0

補足ありがとうございます。

まず↓を押した時については、プレイヤーのRigidbodyがスリープしている可能性が高いです。
詳しくは「[Unity] Rigidbodyのスリープ問題|ftvlog」をご覧ください。
(ちなみに↑を押した時は床に衝突されたことによりスリープが解除され、通常の物理判定(=押されて動く)が行われているものと思われます)

←→を押した時については、IsKinematicがオフなのが恐らく原因です。
RigidbodyのIsKinematicがオンならtransform.positionでの移動ができますが、オフならできません。
(今回の場合、親である床の移動をtransform.positionで行っている=子であるプレイヤーの移動もtransform.positionで行っている=プレイヤーはIsKinematicがオフなので動かない、という流れです)

なのでプレイヤーのIsKinematicをオンにすればいいのですが、こうすると今度は重力が効かなくなります。
結論としては、以下をお試しください。
・通常時はIsKinematicをオフ
・床と接触した時にIsKinematicをオン
・床と離れた時にIsKinematicをオフ、スリープ解除

なお、今回は問題無いと思いますが、衝突するもののIsKinematicとisTriggerの状態により、衝突判定が発生したりしなかったりします。
条件は「UnityのPhysicsについて - プログラムの素」をご覧ください。

投稿2016/03/25 05:33

sakura_hana

総合スコア11425

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

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

van-0215

2016/03/25 09:20

回答ありがとうございます。 まず最初にisKinematicのON/OFF切り替えは2つ目のソースコードをみていただけたら、わかる通り、編集しゲーム中のインスペクタで切り替えができているかも確認ができました。 しかしながら、横に移動することはおろか、プレイヤー自身のスケールが乗った直後からどんどん大きくなっていってしまいました。 次にRigidbodyのスリープについてですが、床を傾ける、WakeUp()を使うなど、やりましたが、できませんでした。(正直、プレイヤーが大きくなりすぎて確認があまりできていない) もしよろしければsakura_hana様ならどのようにして上下に動く床、そしてそれにキャラクターを連動させるか、方法を教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問