///////////////////////////////////// IEnumerator Attack() { if (isCoroutine) yield break; isCoroutine = true; ecZ.Reverse_Magic(); yield return new WaitForSeconds(0.1f);//ちょっと間をおいてから攻撃 GameObject bullet; //アニメーションセット if (animState != 5) { animator.SetTrigger("Attack");//攻撃 animState = 5; } ecZ.Move(ecZ.Player.transform.position - (ecZ.Player.transform.position - transform.position).normalized * 2, ecZ.speed * 5);//Playerの手前で止まる yield return new WaitForSeconds(0.2f);//近づききってから攻撃 bullet = GameObject.Instantiate(Bullet); bullet.transform.FindChild("Armature").gameObject.transform.FindChild("Bone").gameObject.GetComponentInChildren<Attack_Parameter>().Parent = this.gameObject;//誰が撃ったかを渡す //弾を飛ばす処理 bullet.transform.position = Muzzle.position + (ecZ.direction); bullet.transform.rotation = Quaternion.LookRotation(ecZ.direction);//回転させて弾頭を進行方向に向ける //bullet.GetComponent<Rigidbody>().velocity = ((ecZ.Player.transform.position - this.transform.position).normalized * at_para.speed); /*if(!audioSource.isPlaying){ audioSource.Play(); }*/ Destroy(bullet, bullet.transform.FindChild("Armature").gameObject.transform.FindChild("Bone").gameObject.GetComponentInChildren<Attack_Parameter>().GetA_Time()); yield return new WaitForSeconds(1); //アニメーションセット if (animState != 4) { animator.SetTrigger("Syobon");//ここで落ち込ませる animState = 4; } yield return new WaitForSeconds(4);//落ち込み待ち ecZ.Reverse_Magic(); state = Fatbat_State.Syobon; priority = 4; isCoroutine = false; }
public void SetState(Fatbat_State state) { this.state = state; }
// Update is called once per frame void Update() { //アニメーションを取得してみる AnimatorStateInfo anim = animator.GetCurrentAnimatorStateInfo(0); if (state == Fatbat_State.Attack) { priority = 1; //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); coroutine = StartCoroutine(Attack()); } if (ecZ.isDamage) { if (priority >= 2) { state = Fatbat_State.Damage; priority = 2; } } if (state == Fatbat_State.Damage) { if (priority >= 6) { priority = 2; //アニメーションセット if(animState != 6) { animator.SetTrigger("Kyorokyoro");//ここできょろきょろ animState = 6; } //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); } else if(priority >= 2) { priority = 2; //アニメーションセット if (animState != 1) { animator.SetTrigger("Walk");//歩き animState = 1; } //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); ecZ.Move(ecZ.Player.transform.position, ecZ.speed);//Playerに近づく //プレイヤとの距離で行動変化 if ((ecZ.Player.transform.position - transform.position).magnitude < 5)//距離が5以下だったら { state = Fatbat_State.Attack; priority = 1; } if ((ecZ.Player.transform.position - transform.position).magnitude > 20)//距離が10以上だったら { state = Fatbat_State.Syobon; priority = 4; } } //ダンスしてるとき=プレーヤに十分近づいてるので攻撃 if(state == Fatbat_State.Dance) { state = Fatbat_State.Attack; priority = 1; } } if (ecZ.isReturn) { if (priority >= 3) { state = Fatbat_State.Return; priority = 3; } } if (state == Fatbat_State.Return) { if (priority >= 3) { priority = 3; //アニメーションセット if (animState != 1) { animator.SetTrigger("Walk");//歩き animState = 1; } //とりあえず中心へ(Territoryはワールド座標にしとく) ecZ.Move(ecZ.Territory.position, ecZ.speed); //前を向ける transform.rotation = Quaternion.Slerp(transform.localRotation, Quaternion.LookRotation(ecZ.Territory.localPosition - transform.localPosition), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); //テリトリとの距離で行動変化 if ((ecZ.Territory.localPosition - transform.localPosition).magnitude < 5)//真ん中ら辺まで戻ったら { state = Fatbat_State.Search; priority = 6; } } } if (state == Fatbat_State.Ikaku) { if (priority >= 4) { //ちょっと間をおいてから行動 time += Time.deltaTime; if (time < 3) { priority = 4; //アニメーションセット if (animState != 2) { animator.SetTrigger("Ikaku");//威嚇 animState = 2; } //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); } else { //プレイヤとの距離で行動変化 if ((ecZ.Player.transform.position - transform.position).magnitude < 5)//距離が5以下だったら { state = Fatbat_State.Dance; priority = 4; } else if ((ecZ.Player.transform.position - transform.position).magnitude < 20)//距離が20以下だったら { ecZ.Move(ecZ.Player.transform.position, ecZ.speed);//Playerに近づく if (animState != 1) { animator.SetTrigger("Walk");//威嚇 animState = 1; } } else { state = Fatbat_State.Syobon; priority = 4; } } } } if (state == Fatbat_State.Dance) { if (priority >= 4) { priority = 4; //アニメーションセット if (animState != 3) { animator.SetTrigger("Dance");//ダンス animState = 3; } //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); //MPを奪う coroutine = StartCoroutine(Dance()); if ((ecZ.Player.transform.position - transform.position).magnitude > 20) { state = Fatbat_State.Syobon; priority = 4; StopCoroutine(Dance());//一応止めとく isCoroutine = false; } } } if (state == Fatbat_State.Syobon) { if (priority >= 4) { priority = 4; //アニメーションセット if (animState != 6) { animator.SetTrigger("Kyorokyoro");//きょろきょろ animState = 6; } //とりあえず中心へ(Territoryはワールド座標にしとく) ecZ.Move(ecZ.Territory.position, ecZ.speed); //前を向ける transform.rotation = Quaternion.Slerp(transform.localRotation, Quaternion.LookRotation(ecZ.Territory.localPosition - transform.localPosition), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); time += Time.deltaTime; //テリトリとの距離で行動変化 if ((ecZ.Territory.localPosition - transform.localPosition).magnitude < 5)//真ん中ら辺まで戻ったら { ecZ.Stop();//止める } //5秒くらい落ち込んでてもらう if (time > 5) { state = Fatbat_State.Search; priority = 6; time = 0; } } } if (ecZ.isFind) { if (priority >= 5) { priority = 5; state = Fatbat_State.Ikaku; priority = 4; } } if (state == Fatbat_State.Search) { if (priority >= 6) { priority = 6; //アニメーションセット if (animState != 1) { animator.SetTrigger("Walk");//歩き animState = 1; } //前を向ける transform.rotation = Quaternion.Slerp(transform.localRotation, Quaternion.LookRotation(ecZ.move_controller.End - transform.localPosition), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); MS.Move(ecZ.move_controller.End, ecZ.speed); } } //状態が変化したら前の状態のいどうは中断 if (oldstate != state) { time = 0; MS.Stop(); ecZ.Stop(); } oldstate = state; }
//プレイヤとの距離で攻撃方法が変化 ///////////////////////////////////// IEnumerator Attack0() { if (isCoroutine) yield break; isCoroutine = true; ecZ.Reverse_Magic(); yield return new WaitForSeconds(0.1f);//ちょっと間をおいてから攻撃 GameObject[] bullet = new GameObject[2]; //アニメーションセット if (animState != 5) { animator.SetTrigger("Attack0");//攻撃 animState = 5; } for(int i = 0;i < 2; i++) { bullet[i] = GameObject.Instantiate(Bullet[0]); bullet[i].transform.FindChild("Armature").gameObject.transform.FindChild("Bone").gameObject.GetComponentInChildren<Attack_Parameter>().Parent = this.gameObject;//誰が撃ったかを渡す //弾を飛ばす処理 bullet[i].transform.position = Muzzle[i].position + (ecZ.direction); bullet[i].transform.rotation = Quaternion.LookRotation(ecZ.direction);//回転させて弾頭を進行方向に向ける Destroy(bullet[i], bullet[i].transform.FindChild("Armature").gameObject.transform.FindChild("Bone").gameObject.GetComponentInChildren<Attack_Parameter>().GetA_Time()); yield return new WaitForSeconds(0.2f);//ちょっと間をおいてから攻撃 } yield return new WaitForSeconds(1); ecZ.Reverse_Magic(); state = Fatbat_State.Search; priority = 6; isCoroutine = false; }
// Update is called once per frame void Update() { //アニメーションを取得してみる AnimatorStateInfo anim = animator.GetCurrentAnimatorStateInfo(0); if (state == Fatbat_State.Attack) { priority = 1; //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); //プレイヤとの距離で攻撃変化 if ((ecZ.Player.transform.position - transform.position).magnitude < 5) { coroutine = StartCoroutine(Attack0());//鎌攻撃 } else { coroutine = StartCoroutine(Attack1());//かまいたち } } if (ecZ.isDamage) { if (priority >= 2) { state = Fatbat_State.Damage; priority = 2; } } if (state == Fatbat_State.Damage) { if (priority >= 6) { priority = 2; //アニメーションセット if (animState != 6) { animator.SetTrigger("Kyorokyoro");//ここできょろきょろ animState = 6; } //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); } else if (priority >= 2) { priority = 2; //アニメーションセット if (animState != 1) { animator.SetTrigger("Walk");//歩き animState = 1; } //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); //カウンター state = Fatbat_State.Attack; priority = 1; } } if (ecZ.isReturn) { if (priority >= 3) { state = Fatbat_State.Return; priority = 3; } } if (state == Fatbat_State.Return) { if (priority >= 3) { priority = 3; //アニメーションセット if (animState != 1) { animator.SetTrigger("Walk");//歩き animState = 1; } //とりあえず中心へ(Territoryはワールド座標にしとく) ecZ.Move(ecZ.Territory.position, ecZ.speed); //前を向ける transform.rotation = Quaternion.Slerp(transform.localRotation, Quaternion.LookRotation(ecZ.Territory.localPosition - transform.localPosition), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); //テリトリとの距離で行動変化 if ((ecZ.Territory.localPosition - transform.localPosition).magnitude < 10)//真ん中ら辺まで戻ったら { state = Fatbat_State.Search; priority = 6; } } } if (state == Fatbat_State.Ikaku) { if (priority >= 4) { //ちょっと間をおいてから行動 time += Time.deltaTime; if (time < 1.5f) { priority = 4; //アニメーションセット if (animState != 2) { animator.SetTrigger("Ikaku");//威嚇 animState = 2; } //前を向ける transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(ecZ.Player.transform.position - transform.position), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); } else { state = Fatbat_State.Attack; priority = 1; } } } if (state == Fatbat_State.Dance) { if (priority >= 4) { state = Fatbat_State.Attack; priority = 1; } } if (state == Fatbat_State.Syobon) { if (priority >= 4) { state = Fatbat_State.Attack; priority = 1; } } if (ecZ.isFind) { if (priority >= 5) { priority = 5; state = Fatbat_State.Ikaku; priority = 4; } } if (state == Fatbat_State.Search) { if (priority >= 6) { priority = 6; //アニメーションセット if (animState != 1) { animator.SetTrigger("Walk");//歩き animState = 1; } //前を向ける transform.rotation = Quaternion.Slerp(transform.localRotation, Quaternion.LookRotation(ecZ.move_controller.End - transform.localPosition), 0.05f); transform.rotation = Quaternion.Euler(0, transform.eulerAngles.y, 0); MS.Move(ecZ.move_controller.End, ecZ.speed); } } //状態が変化したら前の状態のいどうは中断 if (oldstate != state) { time = 0; MS.Stop(); ecZ.Stop(); } oldstate = state; }
//プレイヤとの距離で攻撃方法が変化 IEnumerator Attack1() { if (isCoroutine) yield break; isCoroutine = true; ecZ.Reverse_Magic(); yield return new WaitForSeconds(0.1f);//ちょっと間をおいてから攻撃 GameObject[] bullet = new GameObject[2]; //アニメーションセット if (animState != 5) { animator.SetTrigger("Attack1");//攻撃 animState = 5; } for (int i = 0; i < 2; i++) { bullet[i] = GameObject.Instantiate(Bullet[1]); bullet[i].GetComponent<Attack_Parameter>().Parent = this.gameObject;// //弾を飛ばす処理 bullet[i].transform.position = Muzzle[i].position + (ecZ.direction); bullet[i].transform.rotation = Quaternion.LookRotation(ecZ.direction);//回転させて弾頭を進行方向に向ける bullet[i].GetComponent<Rigidbody>().velocity = ((ecZ.Player.transform.position - transform.position).normalized + new Vector3(0,0.3f,0)) * bullet[i].GetComponent<Attack_Parameter>().speed;//キャラの向いてる方向 Destroy(bullet[i], bullet[i].GetComponent<Attack_Parameter>().GetA_Time()); yield return new WaitForSeconds(0.5f);//ちょっと間をおいてから攻撃 } yield return new WaitForSeconds(1.5f); ecZ.Reverse_Magic(); state = Fatbat_State.Search; priority = 6; isCoroutine = false; }