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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

Q&A

解決済

1回答

991閲覧

定位置に入ったら、障害物を動かしたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

0グッド

0クリップ

投稿2021/03/05 07:00

壁の上の、針の手前に来たら針が上に飛ぶ、という仕掛けを作りたいとおもっています。
コンソールを見る限り、仕掛けのスイッチは入っているようなのですが、針が動いてくれません。

手前のスイッチに来たら罠がジャンプして、その罠にはどこから接触しても死ぬ、というようにするにはどうしたらいいでしょうか。

罠とスイッチのインスペクターは以下の図になります。
イメージ説明
イメージ説明
コードは罠がこちらです。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Traps : MonoBehaviour { public GameObject TrapSwitch1; public float trapJumpPower;//トラップのジャンプ力 Rigidbody2D rigid2D; private void Start() { rigid2D = GetComponent<Rigidbody2D>(); } public void Trap1Activate() { rigid2D.AddForce(Vector2.up * trapJumpPower); } } コード

プレイヤーのコードがこちらです。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerManager : MonoBehaviour { //public変数 [Header("横方向速度")] public float xspeed = 8; [Header("ジャンプ力")] public float jumpPower = 1000; public GroundCheck ground;//GroundCheckを貼り付ける public GameManager gameManager;//GameManagerを貼り付ける public LayerMask blockLayer; public Traps trap1; //プライベート変数 private float speed; private bool isGround = false; Animator animator; bool isDead = false; public enum DIRECTION_TYPE { STOP, RIGHT, LEFT, } DIRECTION_TYPE direction = DIRECTION_TYPE.STOP; Rigidbody2D rigidbody2D; private void Start() { rigidbody2D = GetComponent<Rigidbody2D>(); animator = GetComponent<Animator>(); } private void Update() { //接地判定を得る isGround = ground.IsGround(); float horizontalKey = Input.GetAxis("Horizontal"); if(horizontalKey == 0) { //止まっている direction = DIRECTION_TYPE.STOP; animator.SetBool("run", false); } else if (horizontalKey > 0) { //右向きに進む direction = DIRECTION_TYPE.RIGHT; animator.SetBool("run", true); } else if (horizontalKey < 0) { //左向きに進む direction = DIRECTION_TYPE.LEFT; animator.SetBool("run", true); } //スペースボタンでかつ接地していればジャンプ if (Input.GetKeyDown("space") && isGround) { //ジャンプ関数 Jump(); } } private void FixedUpdate() { if(isDead) { return; } 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); } private void OnTriggerEnter2D(Collider2D collision) { if (isDead) { return; } if (collision.gameObject.tag == "Trap") { PlayerDie(); } if (collision.gameObject.tag == "Goal") { Debug.Log("ゴール"); gameManager.GameClear(); } if (collision.gameObject.tag == "TrapSwitch1") { Debug.Log("罠ジャンプ"); trap1.Trap1Activate(); } } private void PlayerDie() { isDead = true; rigidbody2D.velocity = new Vector2(0, 0); rigidbody2D.AddForce(Vector2.up * jumpPower); animator.Play("PlayerDie"); CapsuleCollider2D capsuleCollider2D = GetComponent<CapsuleCollider2D>(); Destroy(capsuleCollider2D); gameManager.GameOver(); } } コード

よろしくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく、このスクリプトではアタッチしたオブジェクトのRigidbodyを取得してしまいますので

rigidbody2D = SpikePrefab.GetComponent<Rigidbody2D>();

というように取得しないといけないと思います。

投稿2021/03/05 08:50

編集2021/03/05 23:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/03/05 09:21

ありがとうございます。うまくできました。 基本がよくわかってないので、もしよろしかったら教えてください。 飛ばしたい対象はSpikePrefab (4)なので、これをアタッチしRigidbodyを取得してAddForceする(という言い方でいいのでしょうか)、というイメージで書いていたのですが、 あくまでスイッチであるはずのTrapSwitch1のRigidbodyを取得して、これにAddForceをすればうまくいった、という原理がわかりません。
退会済みユーザー

退会済みユーザー

2021/03/05 23:38 編集

回答にに書いた文は、~のオブジェクトのRigidbodyを取得し、AddForceするというものです。 今回の場合、コライダーとトラップ部分が別なのでTrapSwitchにスクリプトを入れないと動きません。 なので管理しやすくするのならば、SpikePrefabをTrapSwitchの子オブジェクトにし、スクリプトを下記のように書き換えればできると思います。 呼び出す側(プレイヤー) if (collision.gameObject.tag == "TrapSwitch1") { Debug.Log("罠ジャンプ"); collision.TrapsActivate(); } traps using System.Collections; using System.Collections.Generic; using UnityEngine; public class Traps : MonoBehaviour { public float trapJumpPower;//トラップのジャンプ力 public GameObject root ; //子オブジェクトの取得(トラップ本体) Rigidbody2D rigid2D; private void Start() {    root = transform.Find("SpikePrefab").gameObject; rigid2D = root.GetComponent<Rigidbody2D>();    } public void Trap1Activate() { rigid2D.AddForce(Vector2.up * trapJumpPower); } } このようにすることで親のオブジェクトを取得することができます。
退会済みユーザー

退会済みユーザー

2021/03/06 11:02

そういう場合でも子オブジェクトにするといいんですね。 丁寧に教えて頂いてありがとうございます。
退会済みユーザー

退会済みユーザー

2021/03/06 12:07

解決できたようでよかったです。 ゲーム開発頑張ってください^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問