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

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

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

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

Unity

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

Q&A

解決済

1回答

407閲覧

Unity 予期しない位置で、当たり判定が出てしまう

hjjgkhl

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2022/07/26 08:57

編集2022/07/26 14:00

前提

Unityの2Dプロジェクトで簡易的な手押し相撲のゲームを作っています。

playerオブジェクトとenemyオブジェクトが互いにぶつかるようにタグで当たり判定をしていてます。
Playerスクリプトはplayerオブジェクトに付加していて、Enemyスクリプトはenemyオブジェクトに付加しています。
EnemyスクリプトはPlayerスクリプトと同じ動きをenum State caseで自動で動くようにしています。

playerオブジェクトにPlayerMeタグを付加し、enemyオブジェクトにEnemyタグを付加しています。

EnemyスクリプトにもPlayerとの当たり判定が出るように下記のように記述しています。
( private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.gameObject.tag == "PlayerMe")
{
if(transform.position.x < 0.5)
{
Debug.Log("チェック");
}
}
})

実現したいこと

スクリプト上のAvoidでplayerオブジェクトの初期位置をenemyオブジェクトとぶつからない位置に移動したら、enemyオブジェクトと当たり判定が出ないようにしたい。

発生している問題

スクリプト上のAvoidでplayerオブジェクトの座標を初期位置(-1.5f, 0.5f, 0)からenemyオブジェクトとぶつからない位置(-1.5f, 2.0f, 0)へ移動させたにも関わらず、Enemyスクリプトの当たり判定が出てしまう。

間違っているところを指摘いただけると幸いです。

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { private float timer; public float startPosition; public float staryPosition; public float endPoint; GameObject enemy; Rigidbody2D rigidbody; GameObject player; // Start is called before the first frame update void Start() { enemy = GameObject.Find("Enemy"); startPosition = transform.position.x; staryPosition = transform.position.y; rigidbody = GetComponent<Rigidbody2D>(); player = GameObject.Find("Player"); } // Update is called once per frame void Update() { Challenge(); Avoid(); Retry(); } private void OnTriggerEnter2D(Collider2D collision) { if(collision.gameObject.tag == "Enemy") { if(transform.position.x > 0.5f) { Debug.Log("ぶつかったよ"); enemy.transform.Rotate(new Vector3(0, 0, -10)); ScrollEnd(); } else { ScrollEnd(); } } } void Challenge() { if(Input.GetKeyDown("space")) { Debug.Log("OK"); rigidbody.velocity = new Vector3(1.5f, 0f, 0f) * 3; } } void Retry() { if(Input.GetKey(KeyCode.A)) { Vector3 v = new Vector3(-1.5f, 0.5f, 0f); transform.position = v; transform.Translate(0, -1 * Time.deltaTime, 0); } } void Avoid() { if(Input.GetKey(KeyCode.R)) { Vector3 v = new Vector3(-1.5f, 2.0f, 0f); transform.position = v; } } void ScrollEnd() { Vector3 v = new Vector3(-1.5f, 0.5f, 0f); transform.position = v; rigidbody.velocity = Vector3.zero; } private void FixedUpdate() { if(transform.position.x >= 2.1f) { ScrollEnd(); } if(transform.position.y >= 1.9f) { ScrollEnd(); } } }

試したこと

①初期位置(-1.5f, 0.5f, 0f)を(-1.5f, 2.0f, 0f)に変更すると、当たり判定が出なくなる。
②Enemyスクリプトのタグでの当たり判定の条件を取り除いて,Avoid関数で初期位置(-1.5f, 0.5f, 0f)をぶつからない位置(-1.5f, 2.0f, 0f)に変更しても当たり判定が出てしまう。
③Enemyスクリプト内のplayer変数でPlayerオブジェクトを取得してif(player.transform.position.y = 2.0f){Debug.Log("OK")}と記述したが、実行したときにAvoid関数でy軸の2.0fに移動した際、Consoleに
"OK"と表示されませんでした。

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

playerのScale(1, 1, 1)position(-1.5, 0.5, 0)
enemyのScale(1, 1, 1)position(2.2, 0.5, 0)
EnemyスクリプトにはPlayerスクリプトと同じ動きをenmuのStateで分けて自動で動くようにしています。
playerとenemyには両方ともRigidbody2DとBoxCollider2Dを付加していて、
IsTrigger,Simulatedにチェックを入れていて、Kinematicにしています。
playerのBoxColliderはゲームオブジェクトと同じ大きさになっています。
enemyのBoxColliderはゲームオブジェクトと同じ大きさになっています。
enemyとplayerオブジェクトが動いている時はBoxCollider2Dは両方ともオブジェクトと同じ大きさでオブジェクトの動きに合わせて同じく動いています。

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

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

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

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

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

guest

回答1

0

自己解決

初歩的なミスでした。下の記述を消し忘れていました。

if(transform.position.x >= 2.1f) { ScrollEnd(); }

投稿2022/07/27 05:17

hjjgkhl

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問