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

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

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

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

Unity

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

Q&A

解決済

1回答

1335閲覧

オブジェクトを一定距離だけ動かしたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/04/26 07:45

編集2021/04/27 06:21

オブジェクトのy座標がゼロになったときに、オブジェクトを止めたいのですが、止まることなく動き続けてしまいます。
そのかわり、なぜかプレイヤーキャラのy座標がうごかなくなります。
状況としては、y軸のマイナス側からプラスに向かってオブジェクトが動き、それを0のところで止めたい、というものです。
解決方法を教えてください。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Trap2 : MonoBehaviour { public GameObject TrapSpike2; public float trap2speed; Rigidbody2D rigidTrap2; void Start() { rigidTrap2 = TrapSpike2.GetComponent<Rigidbody2D>(); } public void Trap2Activate() { rigidTrap2.velocity = new Vector2(0, trap2speed); if (rigidTrap2.position.y >= 0 ){//ここで止めようとしました。 >=の他にも==も試しました。 { rigidTrap2.velocity = new Vector2(0, 0); } } } コード

イメージ説明

using UnityEngine; public class PlayerManager : MonoBehaviour { //public public float xspeed; public float jumpPower; public GroundCheck ground; public GameManager gameManager; //SE [SerializeField] AudioClip jumpSE; public Traps trap1; public Trap2 trap2; //private private bool isGround = false; float speed; bool isDead = false; AudioSource audioSource; public enum DIRECTION_TYPE { STOP, RIGHT, LEFT } DIRECTION_TYPE direction = DIRECTION_TYPE.STOP; Rigidbody2D rigidbody2D; Rigidbody2D trapSpike1; Animator animator; private void Start() { rigidbody2D = GetComponent<Rigidbody2D>(); trapSpike1 = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); audioSource = GetComponent<AudioSource>(); } void Update() { if (isDead) { return; } //接地判定を得る isGround = ground.IsGround(); float x = Input.GetAxis("Horizontal"); //speedというパラメータにxを代入 animator.SetFloat("speed", Mathf.Abs(x)); if (x == 0) { //止まっている direction = DIRECTION_TYPE.STOP; } else if (x > 0) { //右に動く direction = DIRECTION_TYPE.RIGHT; } else if (x < 0) { //左に動く direction = DIRECTION_TYPE.LEFT; } //スペース押したらジャンプ if (isGround) { if (Input.GetKeyDown("space")) { Jump(); } else { animator.SetBool("isJumping", false); } } switch (direction) { case DIRECTION_TYPE.STOP: speed = 0; break; case DIRECTION_TYPE.RIGHT: speed = xspeed; transform.localScale = new Vector3(1, 1, 1); break; case DIRECTION_TYPE.LEFT: speed = -xspeed; transform.localScale = new Vector3(-1, 1, 1); break; } rigidbody2D.velocity = new Vector2(speed, rigidbody2D.velocity.y); } void Jump() { //上に力を加える rigidbody2D.AddForce(Vector2.up * jumpPower); animator.SetBool("isJumping", true); audioSource.PlayOneShot(jumpSE); } private void OnTriggerEnter2D(Collider2D collision) { if (isDead) { return; } if (collision.gameObject.tag == "Trap") { Debug.Log("GameOver"); gameManager.GameOver(); PlayerDeath(); } if (collision.gameObject.tag == "Finish") { Debug.Log("GameClear"); gameManager.GameClear(); } //トラップSwitchのタグ if (collision.gameObject.tag == "Switch1") { Debug.Log("罠1起動"); trap1.Trap1Activate(); } if (collision.gameObject.tag == "Switch2") { Debug.Log("罠2起動"); trap2.Trap2Activate(); } if (collision.gameObject.tag == "Switch3") { Debug.Log("ブロック出現"); //trap2.Trap2Activate(); } } void PlayerDeath() { BoxCollider2D boxCollider2D = GetComponent<BoxCollider2D>(); Destroy (boxCollider2D); rigidbody2D.velocity = new Vector2(0,0); rigidbody2D.AddForce(Vector2.up * 400); animator.Play("PlayerDeathAnimation"); gameManager.GameOver(); isDead = true; } } コード

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

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

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

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

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

seastar3

2021/04/26 12:31

憶測ですみませんが、プレーヤーオブジェクトが影響を受けるとしたら、 rigidTrap2 = TrapSpike2.GetComponent<Rigidbody2D>(); の前に TrapSpike2 = 参照するオブジェクト; のようなコードが必要なのではないでしょうか。
退会済みユーザー

退会済みユーザー

2021/04/26 12:47

ご回答ありがとうございます。 public GameObject TrapSpike2; を宣言して、TrapSwitch2という判定のオブジェクトに付けたTrap2のスクリプトにTrapSpike2はアタッチしています。 そういうことではないですか? 一応図も追加しておきます。
seastar3

2021/04/26 15:01

Unityはよく知らないのですが、 public GameObject TrapSpike2; だけでは、型宣言のみで、この妨害ブロックの実体のポインタを受け取っていないのではないかと思い、コメントしました。
退会済みユーザー

退会済みユーザー

2021/04/26 16:51

ポインタというものについて詳しくはないのですが、調べてみたところ、メモリの保存領域のアドレスそのもののことですね。 それを受け取っていないとなると、TrapSpike2は全く動かないということにはなりませんか?
退会済みユーザー

退会済みユーザー

2021/04/26 17:48

Trap2Activateが別のコードから呼ばれていると思いますが、どのように呼ばれていますか? 1度だけ呼ばれた場合でもvelocityが変更されますので上方向へ移動するとして、停止処理はこのメソッドが呼ばれ続けていないと行われません。 プレイヤーの不具合はプレイヤー側のコードに何か問題があるのでは?
退会済みユーザー

退会済みユーザー

2021/04/27 06:24

呼び出し側のコードを追記しました。 呼び出している箇所は if (collision.gameObject.tag == "Switch2") { Debug.Log("罠2起動"); trap2.Trap2Activate(); のところです。 呼ばれ続ける、ということはUpdateの中に放りこむということでしょうか。
退会済みユーザー

退会済みユーザー

2021/04/27 08:21

単純な方法だとそうなります。 Trap2Activateではvelocityにspeed文の上方向への力を与えて終わり。 後の停止処理はTrap2スクリプトにvoid Update()を作ってそこに以降のif文を記入します。 それだけでも発動して止まる、という動きは再現できるはず。 例えば、 bool kidou = false; private void Update() { if (!kidou) return; rigidTrap2.velocity = new Vector2(0, trap2speed); if (rigidTrap2.position.y >= 0 ){//ここで止めようとしました。 >=の他にも==も試しました。 { rigidTrap2.velocity = new Vector2(0, 0); } } public void Trap2Activate() { kidou = true; } 意味は同じです。
退会済みユーザー

退会済みユーザー

2021/04/27 08:59

うまくできました。ありがとうございます。 これはkidou = trueであるかぎり上に上がろうとするのを、フレームごとにグググ、と止め続けるイメージでしょうか。
退会済みユーザー

退会済みユーザー

2021/04/28 05:43

止め続ける、というよりvelocityとして与えた値を0にする条件式を実行するためには? という事です。 Trap2Activateの中で判定をしても思っているタイミングでは判定されない、という事です。 その他の条件にもよりますが、例えばGravityScaleが0などvelocityにあたえられる抵抗がない(物理演算上)場合、 bool kidou = false; private void Update() { if (!kidou) return; if (rigidTrap2.position.y >= 0 ){//ここで止めようとしました。 >=の他にも==も試しました。 { rigidTrap2.velocity = new Vector2(0, 0); kidou = false; } } public void Trap2Activate() { kidou = true; rigidTrap2.velocity = new Vector2(0, trap2speed); } これでも同じ動きになるはずです。 質問内容の上記において重要な部分でTrap2Activateというメソッドが実行される部分というのはCollisionで判定された一度のみで、そこでフレームにまたがる判定処理を書いても、常に判定してくれる様な仕組みにはなりませんって事です。
退会済みユーザー

退会済みユーザー

2021/04/28 07:26

なるほど。そういうことだったのですね。 すごく丁寧に教えていただき、本当にありがとうございます。 助かりました。
guest

回答1

0

ベストアンサー

bool kidou = false;
private void Update()
{
if (!kidou) return;
if (rigidTrap2.position.y >= 0 ){//ここで止めようとしました。 >=の他にも==も試しました。
{
rigidTrap2.velocity = new Vector2(0, 0);
kidou = false;
}
}

public void Trap2Activate() {
kidou = true;
rigidTrap2.velocity = new Vector2(0, trap2speed);
}

投稿2021/04/28 07:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問