キャラが設定した位置に入ってから二秒後にブロックが現れるという状況を作りたいとおもっています。
最初はブロックが現れるということでSetActiveを罠用のコードに書いて、プレイヤーのコードで呼び出そうとしました。
直接呼び出そうとして Invoke("trap3.Trap3Activate",2f)のように書いていたのですが、これは調べているうちに間違いだとわかりました。
なので別の箇所に プレイヤーのコードで
void Trap3Invoke()
{
trap3.Trap3Activate();
}
と作り、
if (collision.gameObject.tag == "TrapSwitch3") { Invoke("Trap3Invoke", 2.0f); }
というコードを書いたのですが、うまくいきません。
原因を教えてほしく存じます。
画面は以下になります。
コード全体は以下のとおりです。
罠のスイッチにはTrapSwitch3のタグがつけてあります。
罠用コード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Trap3 : MonoBehaviour { public GameObject Bricks_16; public GameObject Bricks_16_2; public GameObject Bricks_16_3; public GameObject Bricks_16_4; private void Start() { } public void Trap3Activate() { Debug.Log("罠3発動"); Bricks_16_2.SetActive(true); } } コード
プレイヤーコード
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; public Trap2 trap2; public Trap3 trap3; //プライベート変数 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>(); } 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(); } //2秒遅れてブロック出現←説明文で書いたコード void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.tag == "TrapSwitch3") { Invoke("Trap3Invoke", 2.0f); } } } 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(); } if (collision.gameObject.tag == "TrapSwitch2") { Debug.Log("罠2始動"); trap2.Trap2Activate(); } //Invoke発動のための関数←説明文で書いたコード void Trap3Invoke() { trap3.Trap3Activate(); } } 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(); } } コード
void Start() { } void Update() { if (Input.GetKey(KeyCode.Space)) { samp.Move(); // Debug.Log(samp); Invoke("Vanish2", 1.5f); } } private void Vanish2() { samp.Vanish(); } } コード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Sample : MonoBehaviour { public float xspeed; public float yspeed; public GameObject squ; public GameObject cir; public GameObject cup; Rigidbody2D rigidcir; Rigidbody2D rigidcup; Rigidbody2D rigidsqu; private void Start() { rigidcir = cir.GetComponent<Rigidbody2D>(); rigidsqu = squ.GetComponent<Rigidbody2D>(); rigidcup = cup.GetComponent<Rigidbody2D>(); } private void Update() { } public void Move()//これを呼び出したい { cir.transform.Translate(-xspeed, -yspeed, 0); squ.transform.Translate(-xspeed, yspeed, 0); // Debug.Log(squ); } public void Vanish() { cup.SetActive(false); } } コード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Circle : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void OnCollisionEnter2D(Collision2D collision) { if (collision.gameObject.tag == "Square") { Debug.Log("サークルとスクウェアが接触しました"); Debug.Log( collision); Debug.Log( gameObject); } } } コード
回答2件
あなたの回答
tips
プレビュー