Ejemplo n.º 1
0
    /// <summary>
    /// パーティクルを制御
    /// </summary>
    public void UpdateParticle()
    {
        Vector2[] checkPos = new Vector2[] {
            new Vector2(position.x, position.y + 1),
            new Vector2(position.x - 1, position.y),
            new Vector2(position.x, position.y - 1),
            new Vector2(position.x + 1, position.y),
        };

        for (int i = 0; i < 4; i++)
        {
            //触手が生成できる壁のみエフェクト再生
            if (StageGenerator.CheckStageBound(checkPos[i]) ||
                StageGenerator.GetPiece(checkPos[i]))
            {
                ps[i].Stop();
            }
            else
            {
                ps[i].Play();
            }
        }
    }
Ejemplo n.º 2
0
    /// <summary>
    /// はさむように生える触手のスポーン
    /// </summary>
    /// <param name="id">生える触手のID</param>
    /// <returns>できたらtrue</returns>
    bool SpawnTentacle(int id)
    {
        //Debug.Log("SpawnTentacle Start");

        Vector2 spawnPos = (Vector2)pos[id];

        //Debug.Log("SpawnTentacle SpawnPos " + spawnPos);

        RaycastHit2D hit;

        hit = Physics2D.Raycast(spawnPos, Vector2.zero);
        //取得できなければキャンセル
        if (!hit)
        {
            return(false);
        }

        //Debug.Log("SpawnTentacle Get");


        Piece p = hit.collider.GetComponent <Piece>();

        //IDが同じでなければ、触手でなければキャンセル
        if (!p || p.id != 1)
        {
            return(false);
        }

        //向き情報を格納
        Vector2 angle;
        int     revId = id == 0 ? 1 : 0;

        if (currenTentacle[revId])
        {
            //Debug.Log("SpawnTentacle Check");


            //長いほうから予測
            Vector2 checkAngle = p.position - currenTentacle[revId].position;
            if (Mathf.Abs(checkAngle.x) > Mathf.Abs(checkAngle.y))
            {
                if (checkAngle.x < 0)
                {
                    checkAngle = new Vector2(-1, 0);
                }
                else
                {
                    checkAngle = new Vector2(1, 0);
                }
            }
            else
            {
                if (checkAngle.y < 0)
                {
                    checkAngle = new Vector2(0, -1);
                }
                else
                {
                    checkAngle = new Vector2(0, 1);
                }
            }

            Debug.Log("SpawnTentacle Check Angle:" + checkAngle);
            Debug.Log("SpawnTentacle Check Angle:" + currenTentacle[revId].angle);
            //触手は生えているが、向きが正しくない場合
            if (checkAngle != currenTentacle[revId].angle)
            {
                Debug.Log("SpawnTentacle Retry Angle:" + checkAngle);

                SpawnTentacle(revId, currenTentacle[revId].position, checkAngle);
            }

            angle = -currenTentacle[id == 0 ? 1 : 0].angle;
        }
        else
        {
            //順番に検証
            //優先度
            //1.空いているところ
            //2.触手ブロック以外のところ
            //3.触手ブロックのところ

            Vector2?checkResult = null;

            //取得用位置を格納
            Vector2[] checkPos = new Vector2[] {
                new Vector2(p.position.x, p.position.y + 1),
                new Vector2(p.position.x - 1, p.position.y),
                new Vector2(p.position.x, p.position.y - 1),
                new Vector2(p.position.x + 1, p.position.y),
            };
            Piece[] checkPiece = new Piece[4];
            for (int i = 0; i < 4; i++)
            {
                checkPiece[i] = StageGenerator.GetPiece(checkPos[i]);
            }

            //1
            for (int j = 0; j < 4; j++)
            {
                if (!checkPiece[j] && !StageGenerator.CheckStageBound(checkPos[j]))
                {
                    checkResult = checkPos[j];
                    break;
                }
            }
            if (checkResult == null)
            {
                //2
                for (int j = 0; j < 4; j++)
                {
                    if (checkPiece[j] && checkPiece[j].id != 1)
                    {
                        checkResult = checkPiece[j].position;
                        break;
                    }
                }

                //3
                if (checkResult == null)
                {
                    checkResult = checkPiece[0].position;
                }
            }

            angle = ((Vector2)checkResult - p.position).normalized;
        }

        //Debug.Log("SpawnTentacle Angle " + angle);

        return(SpawnTentacle(id, p.position, angle));
    }