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

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

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

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

Unity

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

Q&A

解決済

1回答

1046閲覧

Unityでキャラに物を持たせたい

pokapoka2804

総合スコア15

C#

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

Unity

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

0グッド

0クリップ

投稿2019/01/28 19:54

編集2019/01/29 01:28

前提・実現したいこと

タイトル通り、物を持たせたいです
Unityの2Dです
イメージとしてはマリオが甲羅を持っている感じです

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

発生している問題は
物をキャラクタの手(腕)辺りの上に移動させようとすると、なぜか足部分に移動しくっついてしまうことがあります。うまくいくときもありますが、3割くらいの確率で足に移動してしまいます。

該当のソースコード

C#

1if (collision.gameObject.tag == "Mario") { 2//rb2d.isKinematic = true; 3if (Input.GetKey (KeyCode.RightArrow)) { 4if (facingRight == true) { 5w = Mario.transform.position; 6w.x += 1.3f; 7w.y += 0.15f; 8transform.position = w; 9Debug.Log (w); 10} 11} else if (Input.GetKey (KeyCode.LeftArrow)) { 12if (facingRight == false) { 13w = Mario.transform.position; 14w.x -= 1.3f; 15w.y += 0.15f; 16transform.position = w; 17} 18} 19transform.parent = GameObject.Find ("マリオ").transform;

試したこと

キャラの腕の位置のほんの少し上に物を移動させ、とても短い距離を落下させてキャラと物を接触させています
物を移動させる位置を修正したりしましたが解決できません

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

キャラと物のリジッドボディはオンのままです
物のリジッドボディをオフにすると移動してくっつきはしますが、何も操作していないと、キャラが物に押されているような現象が起き、その場にとどまることができません

他にしていることは、キャラと物に摩擦を加えています。これはキャラが止まったとき、物が腕からストーーーんと飛んで行ってしまうからです。接触時は親子関係にもしていますが、それでもうまく行かなかったので摩擦を加え、飛んでいくことを減らしました

ソースコードのfacingRightは、キャラの向きによって腕の位置も変わるので、向きを判定してそれにあわせた位置に物を移動させています

些細なことでもコメントよろしくお願いします

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

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

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

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

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

stdio

2019/01/29 00:37

該当のソースコードでしっかり枠に収まっていませんよ。
pokapoka2804

2019/01/29 01:29

編集しました、ご指摘ありがとうございます!!
guest

回答1

0

ベストアンサー

このスクリプトだと、
「衝突時に左右キーのどちらも押されていない場合」と
「衝突時に右キーが押されていてfacingRightがfalseの場合」と
「衝突時に左キーが押されていてfacingRightがtrueの場合」には
オブジェクトの移動が実行されません。
その結果衝突時の場所に留まる為、その位置が丁度足の位置なのではないでしょうか。

持っている間、物とキャラの衝突を維持させておく必要があるのかは疑問ですが、
直接的な原因は上記かと思いますので確認してみてください。

投稿2019/01/29 02:00

sakura_hana

総合スコア11427

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

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

pokapoka2804

2019/01/29 09:30

if(左右キー)の中のif (facingRight == true) {、if (facingRight == false) { を消してみたら足の位置でくっつくことがなくなりました! また、 物が上から降ってきたとき、ジャンプして左右キーを放し上から物に着地したときが「衝突時に左右キーのどちらも押されていない場合」だと思うので、 コードは物のスクリプトに書いていたのですが、キャラのスクリプトにカット&ペーストし書き換えて、キャラの向きによって物を移動させる位置を指定することにしました(物の向きで移動させるとキャラの反対側に移動することがあるため)。 めちゃくちゃ悩んでいたのでとても嬉しいです、ありがとうございました! if (collision.gameObject.tag == "Koura") { if (Input.GetKey (KeyCode.RightArrow)) { m = transform.position; m.x += 1.3f; m.y += 0.15f; collision.transform.position = m; } else if (Input.GetKey (KeyCode.LeftArrow)) { m = transform.position; m.x -= 1.3f; m.y += 0.15f; collision.transform.position = m; } else if (facingRight == true) { m = transform.position; m.x += 1.3f; m.y += 0.15f; collision.transform.position = m; } else if (facingRight == false) { m = transform.position; m.x -= 1.3f; m.y += 0.15f; collision.transform.position = m; } }
sakura_hana

2019/01/29 11:41

解決して何よりです。 余談ですが、この内容だと以下のように短く出来ます。 if (collision.gameObject.tag == "Koura") { m = transform.position; m.x += (Input.GetKey (KeyCode.RightArrow) || facingRight) ? 1.3f : -1.3f; m.y += 0.15f; collision.transform.position = m; } 「||」→「または」の意味になります。(いずれかがtrueならtrue、全部falseならfalse) 「(〜〜) ? 値A : 値B」→三項演算子と言います。?の前がtrueなら値A、falseなら値Bが使用されます。 「facingRight」→bool型変数は==を省略すると「trueの場合」を示します。 今回は使いませんでしたが「!facingRight」とすると更に反転して「falseの場合」になります。 if文を連ねるのも流れが分かりやすいのですが、同じコードは何度も書かないようにするとデバッグや修正がしやすくなるのでオススメです。 プログラムではこういう「コードの見直し(良い書き方に直す)」ことを「リファクタリング」というので、余裕が出来たら調べてみるといいと思います。
pokapoka2804

2019/01/29 15:21

三項演算子、本では見たことありましたがこういう時に使うんですね! リファクタリング調べてみました。他の部分もリファクタリングできないか考えてみます! 今日はsakuraさんの丁寧な説明のおかげで目から100枚くらい鱗が落ちました。 もっともっと経験を積んでかっこいい人になります! そして、良いものを作ったり、悩んでいる人をお助けします 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問