/// <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(); } } }
/// <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)); }