//tips
//AIEnemyダメージ同期
ゴーレムをprefabから生成し、各シーンに同期させたのでダメージ判定も調整する。現状はすべてのシーンで攻撃判定およびダメージ判定が生じているので、複数回のダメージ判定が生じている。
1シーンのみにダメージ判定を統一し、その判定を各シーンに飛ばす方法を模索する。
攻撃判定は判定を持つコライダーの有効化をPhotonviewismineで限定する。ダメージを受ける際は、キャラクターの生成シーンのみキャラクターの攻撃判定を持たせ、ゴーレムにダメージが入った際にはすべてのシーンのゴーレムにそのダメージが同期されるようになっておけば良い。
HPscript2で接触対象のcharaModeManagerを取得し、そのモードから自身が受けるダメージ量を特定することができているのでダメージ判定にはHPscript2を使用し、各キャラクターの攻撃スクリプトの方に修正を入れれば良い。
現在ゴーレムの右手にあたるオブジェクトにアタッチされているGolemAttackManagerスクリプトを外し、受け手側にダメージを感知させるためのweapontagをつける。
HPScript2にはゴーレムダメージ用のOnTriggerEnterを追加する必要があるので、参照されるcharaModeManagerスクリプトをアタッチする。すべてのboolはfalseなので自動的に1ダメージを与える形式となる。
下記にスクリプトを記載する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
public class HPScript2 : MonoBehaviourPunCallbacks
{
[SerializeField]
private float maxHp = 3; //体力
[SerializeField]
public float hp;
// HP表示用UI
[SerializeField]
private GameObject HPUI;
HPScript hPScript;
// HP表示用スライダー
private Slider hpSlider;
LoadingScript loadingScript;
GameObject[] playerobjs;
HPScript playerhp;
DeerAtackManager deerAtackManager;
CharaModeManager charaModeManager;
public float powerEnemy = 1; //攻撃力
bool DuringAttack=false;
void Start()
{
hpSlider = HPUI.transform.Find("HPBar").GetComponent<Slider>();
hpSlider.value = 1f;
}
void Update()
{
hpSlider.value = hp / maxHp;
if (hp <= 0)
{
// HP表示用UIを非表示にする
HideStatusUI();
}
}
//HPUIを非表示にする
public void HideStatusUI()
{
HPUI.SetActive(false);
}
private void OnTriggerEnter(Collider other)
{
if (photonView.IsMine)
{
charaModeManager = other.GetComponent<CharaModeManager>();
if (other.gameObject.tag == "Weapon" && DuringAttack == false)//playerの攻撃オブジェクトタブ
{
DuringAttack = true;
if (charaModeManager.wolfmode)
{
photonView.RPC(nameof(AttackDamage2), RpcTarget.All);
//hPScript.hp -= powerEnemy * 2;
Debug.Log("wolfmode");
if (charaModeManager.ultimateflag)
{
photonView.RPC(nameof(AttackDamage100), RpcTarget.All);
//hPScript.hp -= powerEnemy * 100;
charaModeManager.ultimateflag = false;
Debug.Log("ultimateultimate");
}
}
else
{
if (!charaModeManager.deerpowerflag)
{
photonView.RPC(nameof(AttackDamage), RpcTarget.All);
//hPScript.hp -= powerEnemy;
Debug.Log("human");
}
else
{
photonView.RPC(nameof(AttackDamage2), RpcTarget.All);
//hPScript.hp -= powerEnemy * 2;
Debug.Log("human");
charaModeManager.deerpowerflag = false;
}
}
if (hp <= 0)
{
photonView.RPC(nameof(DestroyObj), RpcTarget.All);
//Destroy(this.gameObject); //ゲームオブジェクトが破壊される
}
}
}
}
[PunRPC]
void AttackDamage()
{
hp -= 1;
Debug.Log("AttackDamage");
StartCoroutine("CooltimeAnimation");
}
[PunRPC]
void AttackDamage2()
{
hp -= 2;
Debug.Log("AttackDamage");
StartCoroutine("CooltimeAnimation");
}
[PunRPC]
void AttackDamage100()
{
hp -= 100;
Debug.Log("AttackDamage");
StartCoroutine("CooltimeAnimation");
}
[PunRPC]
void DestroyObj()
{
Destroy(this.gameObject);
}
IEnumerator CooltimeAnimation()
{
yield return new WaitForSeconds(1f);
DuringAttack = false;
}
public void powerRecover()
{
hp += 1;
}
public void powerRecoverall()
{
hp += 3;
}
public void Damageallplayer()
{
playerobjs = GameObject.FindGameObjectsWithTag("Player");
foreach (GameObject obs in playerobjs)
{
playerhp = obs.GetComponent<HPScript>();
playerhp.hp -= 1;
}
}
}
ゴーレムによるダメージ判定は有効でキャラクターを同期対象もまとめて消滅させることができている。
ただ、キャラクターの攻撃をゴーレムにうまく与えられていない。スクリプトを見ていると、ゴーレムを生成したシーンのみで(photonView.IsMine)によるダメージ判定が生じるようになっているのでキャラクターのアクション時に彼らのコライダーがどのシーンでもオンになっているかを確認する。
キャラクターの動作を決めるEnvPlaymove5photon スクリプトを確認すると、Attackmotion()、WaitAnimationfin()にRPCは組み込んでいないのでこの部分を調整していく。
キャラクターのシーンでは攻撃が発生しているが、ゴーレム生成シーンにはその情報が伝わっていない。(photonView.IsMine)で制限されているOnTriggerEnterで接触感知対象から弾かれている形になる。
なので、ゴーレム生成シーンで接触感知をさせるために、キャラクターの攻撃モーションをRPCで他のシーンに伝達する必要がある。