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

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

詳細はこちら
C#

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

Unity

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

Q&A

解決済

2回答

1617閲覧

Unity kinematic設定のプレイヤーが床と接触したときに色が変わるようにしたい

nikumanumaiumai

総合スコア5

C#

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

Unity

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

0グッド

0クリップ

投稿2019/09/19 15:31

編集2019/09/19 16:25

前提・実現したいこと

Unityで横スクロールの2Dアクションゲームを作成しています。
プレイヤーは空中を浮遊させたいのでRigidBody2DのBodyTypeをkinematicにしています。
また床も重力のせいで下に落ちないようにkinematicにしています。
プレイヤーは矢印キーで上下左右に動くように設定し、床と接触したときにプレイヤーの色が青になるようにCollisionモードのOnCollisionStay2Dで制御しようと試みたのですが上手くいかず、色が変わりません。
ちなみにプレイヤーと床両方にPolygon collider 2Dをアタッチして、IsTriggerの項目にチェックは入れていません。そして、プレイヤーをkinematicからdynamicに変更すると上手くいって青になります。
どうしたらkinematicのまま青に変えることができるでしょうか。
教えていただけたら嬉しいです。

発生している問題・エラーメッセージ

void OnCollisionStay2D(Collision2D collision)の中身が実行されていない。
プレイヤーが床を無視して移動してしまう。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6public class PlayerController : MonoBehaviour 7{ 8 Rigidbody2D rigid2D; 9 10 // Start is called before the first frame update 11 void Start() 12 { 13 this.rigid2D = GetComponent<Rigidbody2D>(); 14 } 15 // Update is called once per frame 16 void Update() 17 { 18 19 //左右移動 20 int key = 0; 21 if(Input.GetKey(KeyCode.LeftArrow)) { 22 key = -1; 23 transform.Translate(-0.1f, 0.0f, 0.0f); 24 } 25 if(Input.GetKey(KeyCode.RightArrow)) { 26 key = 1; 27 transform.Translate(0.1f, 0.0f, 0.0f); 28 } 29 if(Input.GetKey(KeyCode.UpArrow)) { 30 transform.Translate(0.0f, 0.1f, 0.0f); 31 } 32 if(Input.GetKey(KeyCode.DownArrow)) { 33 transform.Translate(0.0f, -0.1f, 0.0f); 34 } 35 //キャラの反転 36 if(key != 0){ 37 transform.localScale = new Vector3(-key, 1, 2) / 2; 38 } 39 40 //画面外に落下したとき 41 if(transform.position.y < -10){ 42 SceneManager.LoadScene("GameScene"); 43 } 44 } 45 46 void OnCollisionStay2D(Collision2D collision) 47 { 48 if(collision.gameObject.name == "Floor"){ 49 GetComponent<Renderer>().material.color = Color.blue; 50 } 51 }

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

ベストアンサー

[Unity] 衝突判定における、IsTriggerとRigidbodyとIsKinematicのパターンを実験

ColliderとRigidbodyのそれぞれの挙動については上記が参考になるかと思います。

ただ単純に重力による自然落下を無くしたいのであれば、DynamicにしてGravityScaleを0にするみたいなやり方もあります。

また、hogefugapiyoさんも仰られていますが、すり抜けているのはお互いに物理的挙動を無視しているからです。なので、Kinematicを使いたい場合は物理的挙動を行いたいタイミングでDynamicにするか、座標系で処理を行う等になるかと思います。

投稿2019/09/20 01:47

simapiko

総合スコア332

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

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

nikumanumaiumai

2019/09/20 07:02

Dynamicに変更してGravityScaleを0に設定する方法に変更しました。 また、上記のサイト、とてもためになりました! ありがとうございました^^
guest

0

Kinematic 同士だとそもそも物理演算が切られてる状態なので物理演算の結果による衝突が発生していません。 OnCollision~ 系は判定が取れません。
どちらか片方がDynamicなら取れます。(静止した壁にボールがぶつかった場合などをイメージ)

なので、今回の場合はIs TriggerをONにしてOnTriggerEnter2Dとかで取得してください。

ちなみに両方ともKinematicにするなら物理演算の挙動は不要なのでRigidbody自体がいらない可能性はありませんか?

投稿2019/09/20 00:50

hogefugapiyo

総合スコア3302

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問