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

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

ただいまの
回答率

90.75%

  • Unity

    3594questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1180questions

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

  • Unity2D

    761questions

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 136

GOTOken

score 28

問題点

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

実装&改善したいこと

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

ソースコード全文

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;



public class Player : MonoBehaviour
{
    // 移動可能な範囲
    public static Vector2 m_moveLimit = new Vector2(40f, 3.7f);

    // 指定された位置を移動可能な範囲に収めた値を返す
    public static Vector3 ClampPosition(Vector3 position)
    {
        return new Vector3
        (
            Mathf.Clamp(position.x, -m_moveLimit.x, m_moveLimit.x+80),
            Mathf.Clamp(position.y, -m_moveLimit.y+-3, m_moveLimit.y),
            0
        );
    }

    #region Variable Declaration
    [SerializeField]
    public int MAXJumpCounter;//ジャンプ回数制限数設定用変数(固定数)
    public int JumpCounterPoint;//ジャンプ回数上昇値設定用変数
    public float jumpPower;//Player跳躍力変数
    public float DestroyTsumikiTimer = 1.0f;//積み木削除時間計測用変数
    public GameObject tsumikiPrefabs;//積み木Prefabs格納
    public Vector2 tsumikiGeneratePosition = new Vector2();//積み木生成位置
    public float Playerspeed;
    public int MAX_S;
    [Range(0, 100)] public float PlayerMaxspeed;//プレイヤー移動制限最大値変数
    [Range(0, 100)] public int level;
    public bool isGround;
    public int tsumiki_GenerateLimit;//積み木生成限界数変数
    public int tsumiki_GeneratePoint;//積み木生成個数宣言用変数
    public bool tsumikiDestroyFlag;
    public bool isBlock;//生成確認用変数
    public float ShakeDuration;//振動時間計測用変数
    public float ShakeMagunitude;//振動力計測用変数
    public AudioClip AudioClip;

    public CameraShakeScript camerashake;

    private AudioSource audiosource;//Audio Sourceコンポーネント
    private Rigidbody2D rg2d;//コンポーネント取得用変数
    private Rigidbody2D rb;
    private GameObject tsumikiObj;
    #endregion
    #region Start
    // Use this for initialization
    void Start()
    {
        this.audiosource = GetComponent<AudioSource>();
        tsumikiDestroyFlag = false;
        JumpCounterPoint = 0;
        isGround = false;
        isBlock = false;
        rb = GetComponent<Rigidbody2D>();
    }
    #endregion
    #region Update
    private void Update()
    {
        transform.localPosition = ClampPosition(transform.localPosition);
        //moveY = Input.GetAxis("Vertical") * Playerspeed;
        //Vector3 direction = new Vector2(moveX, 0);
        tsumiki();
    }
    #endregion
    #region Fixed
    private void FixedUpdate()
    {

        //rb.velocity = new Vector3(moveX, 0);
        //関数呼び出し
        PlayerMove();


    }
    #endregion
    #region playermove
    private void PlayerMove()
    {
        //if(Input.GetAxisRaw("Horizontal")<0)
        //{
        //    Playerspeed = 1;
        //}else
        //{
        //    Playerspeed = -1;
        //}
        //ADキーで移動
        float x = Input.GetAxisRaw("Horizontal") * Playerspeed;
        rb.velocity = (new Vector2(x, rb.velocity.y));
        if (x >= PlayerMaxspeed)
        {
            //MAX値のまま移動する処理
            // Debug.Log("MAX!!");
            x = MAX_S;
        }
        Vector3 scale = transform.localScale;
        if (x >= 0)
        {
            scale.x = 4;//右向き
        }
        else

        {
            scale.x = -4;//左向き
        }
        transform.localScale = scale;

        //Wキーでジャンプする
        if (Input.GetKeyDown(KeyCode.W))
        {
            //
            JumpCounterPoint++;//回数上昇
            //回数制限設定変数が回数値よりも上に達した場合false
            if (MAXJumpCounter > JumpCounterPoint)
            {
                // rb.velocity = Vector2.zero;
                rb.AddForce(Vector2.up * jumpPower);
            }
            // Debug.Log("Jump");
        }
    }
    #endregion
    #region tsumiki
    private IEnumerator DestroyTsumikiAfterAWhile(GameObject tsumiki)
    {

        yield return new WaitForSeconds(DestroyTsumikiTimer); // 設定時間経過後再開
        Destroy(tsumiki); // 積み木削除
        tsumiki_GeneratePoint--; // このタイミングで積み木カウンターをデクリメント
        UIClock.ClockManager += 1;//カウンターが減った時に、+1してあげる。
        if (tsumiki_GeneratePoint == 0) { isBlock = false; }
    }
    private void tsumiki()
    {

        // Spaceキーを入力されたら、積み木Prefabを複製する。

        if (Input.GetKeyDown(KeyCode.Space))
        {
            isBlock = true;
            if (isBlock)
            {
                if (tsumiki_GenerateLimit > tsumiki_GeneratePoint)//限界値達成したら通らない
                {            transform.position += new Vector3(0f, 0.5f, 0f);
            Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.right * tsumikiGeneratePosition.x;

                    tsumikiObj = Instantiate(tsumikiPrefabs, position, Quaternion.identity); //積み木Prefabの複製
                    UIClock.ClockManager -= 1;//生成時数値をデクリメントすることで、表示を-1する。

                    StartCoroutine(DestroyTsumikiAfterAWhile(tsumikiObj)); // 生成された積み木の削除を予約
                    var Tsumiki_Pos = transform.localPosition;//Player座標取得

                    tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に
                    tsumiki_GeneratePoint += 1;//生成時に積み木生成個数増加
                   // isBlock = false;
                }

            }
        }
        else if (Input.GetKeyUp(KeyCode.Space))
        {
            isBlock = false;
            tsumikiObj.transform.parent = null;//親子関係解除
            //tsumikiObj.SetActive(false);
            //GameObjectDestroy();

        }
    }
    #endregion
    #region
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.name == "DeadPoint")
        {
            Life.LIFE_SYSTEM -= 3;
            Debug.Log("当たった");

            // Destroy(gameObject);
        }
        if (collision.gameObject.name == "ClearPoint")
        {
            SceneManager.LoadScene("GameClear");
        }
        if (collision.gameObject.tag == "Ground")
        {
            JumpCounterPoint = 0;
        }
        if(collision.gameObject.tag == "Needle"&& !isBlock)
        {
            audiosource.PlayOneShot(AudioClip);
            camerashake.Shake(ShakeDuration, ShakeMagunitude);

            Life.LIFE_SYSTEM -= 1;
        }
        if(collision.gameObject.tag == "Enemy")
        {
            audiosource.PlayOneShot(AudioClip);

            camerashake.Shake(ShakeDuration, ShakeMagunitude);

            Life.LIFE_SYSTEM -= 1;
        }
    }
}
#endregion
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    3594questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1180questions

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

  • Unity2D

    761questions