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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

1回答

2843閲覧

parent=null;前にオブジェクトが消え、処理が通らなくなる

GOTOken

総合スコア54

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2018/06/10 14:51

問題点

今回、transform.parentを用いて、同時移動させる。という処理を考えたのですが、parentしているオブジェクトがある一定時間到達後に破棄される処理が存在しております。その影響により、missing errorを吐きダメージを受けるオブジェクトが反応しなくなったりしています。

実装&改善したいこと

ゲームの仕様上、一定時間経つとオブジェクトが破棄される処理は変えれないため、parentの処理を如何にしてエラーを出さないようにするかを御教授していただきたい。

ソースコード全文

見にくいソースコードですみません。

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.SceneManagement; 5 6 7 8public class Player : MonoBehaviour 9{ 10 // 移動可能な範囲 11 public static Vector2 m_moveLimit = new Vector2(40f, 3.7f); 12 13 // 指定された位置を移動可能な範囲に収めた値を返す 14 public static Vector3 ClampPosition(Vector3 position) 15 { 16 return new Vector3 17 ( 18 Mathf.Clamp(position.x, -m_moveLimit.x, m_moveLimit.x+80), 19 Mathf.Clamp(position.y, -m_moveLimit.y+-3, m_moveLimit.y), 20 0 21 ); 22 } 23 24 #region Variable Declaration 25 [SerializeField] 26 public int MAXJumpCounter;//ジャンプ回数制限数設定用変数(固定数) 27 public int JumpCounterPoint;//ジャンプ回数上昇値設定用変数 28 public float jumpPower;//Player跳躍力変数 29 public float DestroyTsumikiTimer = 1.0f;//積み木削除時間計測用変数 30 public GameObject tsumikiPrefabs;//積み木Prefabs格納 31 public Vector2 tsumikiGeneratePosition = new Vector2();//積み木生成位置 32 public float Playerspeed; 33 public int MAX_S; 34 [Range(0, 100)] public float PlayerMaxspeed;//プレイヤー移動制限最大値変数 35 [Range(0, 100)] public int level; 36 public bool isGround; 37 public int tsumiki_GenerateLimit;//積み木生成限界数変数 38 public int tsumiki_GeneratePoint;//積み木生成個数宣言用変数 39 public bool tsumikiDestroyFlag; 40 public bool isBlock;//生成確認用変数 41 public float ShakeDuration;//振動時間計測用変数 42 public float ShakeMagunitude;//振動力計測用変数 43 public AudioClip AudioClip; 44 45 public CameraShakeScript camerashake; 46 47 private AudioSource audiosource;//Audio Sourceコンポーネント 48 private Rigidbody2D rg2d;//コンポーネント取得用変数 49 private Rigidbody2D rb; 50 private GameObject tsumikiObj; 51 #endregion 52 #region Start 53 // Use this for initialization 54 void Start() 55 { 56 this.audiosource = GetComponent<AudioSource>(); 57 tsumikiDestroyFlag = false; 58 JumpCounterPoint = 0; 59 isGround = false; 60 isBlock = false; 61 rb = GetComponent<Rigidbody2D>(); 62 } 63 #endregion 64 #region Update 65 private void Update() 66 { 67 transform.localPosition = ClampPosition(transform.localPosition); 68 //moveY = Input.GetAxis("Vertical") * Playerspeed; 69 //Vector3 direction = new Vector2(moveX, 0); 70 tsumiki(); 71 } 72 #endregion 73 #region Fixed 74 private void FixedUpdate() 75 { 76 77 //rb.velocity = new Vector3(moveX, 0); 78 //関数呼び出し 79 PlayerMove(); 80 81 82 } 83 #endregion 84 #region playermove 85 private void PlayerMove() 86 { 87 //if(Input.GetAxisRaw("Horizontal")<0) 88 //{ 89 // Playerspeed = 1; 90 //}else 91 //{ 92 // Playerspeed = -1; 93 //} 94 //ADキーで移動 95 float x = Input.GetAxisRaw("Horizontal") * Playerspeed; 96 rb.velocity = (new Vector2(x, rb.velocity.y)); 97 if (x >= PlayerMaxspeed) 98 { 99 //MAX値のまま移動する処理 100 // Debug.Log("MAX!!"); 101 x = MAX_S; 102 } 103 Vector3 scale = transform.localScale; 104 if (x >= 0) 105 { 106 scale.x = 4;//右向き 107 } 108 else 109 110 { 111 scale.x = -4;//左向き 112 } 113 transform.localScale = scale; 114 115 //Wキーでジャンプする 116 if (Input.GetKeyDown(KeyCode.W)) 117 { 118 // 119 JumpCounterPoint++;//回数上昇 120 //回数制限設定変数が回数値よりも上に達した場合false 121 if (MAXJumpCounter > JumpCounterPoint) 122 { 123 // rb.velocity = Vector2.zero; 124 rb.AddForce(Vector2.up * jumpPower); 125 } 126 // Debug.Log("Jump"); 127 } 128 } 129 #endregion 130 #region tsumiki 131 private IEnumerator DestroyTsumikiAfterAWhile(GameObject tsumiki) 132 { 133 134 yield return new WaitForSeconds(DestroyTsumikiTimer); // 設定時間経過後再開 135 Destroy(tsumiki); // 積み木削除 136 tsumiki_GeneratePoint--; // このタイミングで積み木カウンターをデクリメント 137 UIClock.ClockManager += 1;//カウンターが減った時に、+1してあげる。 138 if (tsumiki_GeneratePoint == 0) { isBlock = false; } 139 } 140 private void tsumiki() 141 { 142 143 // Spaceキーを入力されたら、積み木Prefabを複製する。 144 145 if (Input.GetKeyDown(KeyCode.Space)) 146 { 147 isBlock = true; 148 if (isBlock) 149 { 150 if (tsumiki_GenerateLimit > tsumiki_GeneratePoint)//限界値達成したら通らない 151 { transform.position += new Vector3(0f, 0.5f, 0f); 152 Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.right * tsumikiGeneratePosition.x; 153 154 tsumikiObj = Instantiate(tsumikiPrefabs, position, Quaternion.identity); //積み木Prefabの複製 155 UIClock.ClockManager -= 1;//生成時数値をデクリメントすることで、表示を-1する。 156 157 StartCoroutine(DestroyTsumikiAfterAWhile(tsumikiObj)); // 生成された積み木の削除を予約 158 var Tsumiki_Pos = transform.localPosition;//Player座標取得 159 160 tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に 161 tsumiki_GeneratePoint += 1;//生成時に積み木生成個数増加 162 // isBlock = false; 163 } 164 165 } 166 } 167 else if (Input.GetKeyUp(KeyCode.Space)) 168 { 169 isBlock = false; 170 tsumikiObj.transform.parent = null;//親子関係解除 171 //tsumikiObj.SetActive(false); 172 //GameObjectDestroy(); 173 174 } 175 } 176 #endregion 177 #region 178 private void OnCollisionEnter2D(Collision2D collision) 179 { 180 if (collision.gameObject.name == "DeadPoint") 181 { 182 Life.LIFE_SYSTEM -= 3; 183 Debug.Log("当たった"); 184 185 // Destroy(gameObject); 186 } 187 if (collision.gameObject.name == "ClearPoint") 188 { 189 SceneManager.LoadScene("GameClear"); 190 } 191 if (collision.gameObject.tag == "Ground") 192 { 193 JumpCounterPoint = 0; 194 } 195 if(collision.gameObject.tag == "Needle"&& !isBlock) 196 { 197 audiosource.PlayOneShot(AudioClip); 198 camerashake.Shake(ShakeDuration, ShakeMagunitude); 199 200 Life.LIFE_SYSTEM -= 1; 201 } 202 if(collision.gameObject.tag == "Enemy") 203 { 204 audiosource.PlayOneShot(AudioClip); 205 206 camerashake.Shake(ShakeDuration, ShakeMagunitude); 207 208 Life.LIFE_SYSTEM -= 1; 209 } 210 } 211} 212#endregion 213 214

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

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

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

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

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

guest

回答1

0

何らかの処理の前にparentの存在確認を行い、存在しなければ処理を行わない、というコードを書けばいいかと。

投稿2018/06/10 23:44

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問