//tips
//photon対応したダメージコードの修正
前回photonのRPCに対応するためダメージ判定を攻撃側からの命令ではなく受けて側のtriggerで行うことにした。
スクリプトの移行及びその際のコライダーの複数回接触によるダメージ倍増に対応する。HPScript2として大幅な改修を行う。
UIにアタッチしているDeerActionlist側とも連動して修正する。
ダメージの判定の際にwolfmode,ultimateflagの参照の必要があるが、それぞれのキャラクターのAtackManagerスクリプトを参照にしているため下記のようにキャラクター分場合わけして参照しなければいけないことになってしまう。
if (other.gameObject.tag == "Weapon")//playerの攻撃オブジェクトタブ
{
deerAtackManager = other.gameObject.GetComponent<DeerAtackManager>();
if (deerAtackManager.wolfmode)
HPScriptの参照を簡易化したいのでwolfmode,ultimateflagのコードは別のスクリプトに写して、キャラクター共有のものとして作成し直す。
CharaModeManagerスクリプトをDeerAtackManagerをアタッチしていたオブジェクトにアタッチし、変更。
public class CharaModeManager : MonoBehaviour
{
public bool wolfmode = false;
public bool ultimateflag = false;
}
二つのフラグを抜き出し、このフラグを参照していた UI側のスクリプトのWolfImageonoffメソッドの修正。
public void WolfImageonoff()
{
//deerAtackManager = myPlayer.GetComponentInChildren<DeerAtackManager>();
charaModeManager= myPlayer.GetComponentInChildren<CharaModeManager>();
charaModeManager.wolfmode = !charaModeManager.wolfmode;
Debug.Log("switchmode");
if (charaModeManager.wolfmode)
{
wolfimage.SetActive(true);
}
else
{
wolfimage.SetActive(false);
}
}
UIのボタン経由で変えるフラグは全てCharaModeManager を通すことでHPScript2で受け取りやすくする。
charaModeManager = other.GetComponent<CharaModeManager>();
こうなってくると各キャラクターのattackmanager自体が不要になってきそう。下記のような移行を行った。
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; //攻撃力
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)
{
charaModeManager = other.GetComponent<CharaModeManager>();
if (other.gameObject.tag == "Weapon")//playerの攻撃オブジェクトタブ
{
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)
{
Destroy(other.gameObject); //ゲームオブジェクトが破壊される
}
}
}
[PunRPC]
void AttackDamage()
{
hp -= 1;
Debug.Log("AttackDamage");
}
[PunRPC]
void AttackDamage2()
{
hp -= 2;
Debug.Log("AttackDamage");
}
[PunRPC]
void AttackDamage100()
{
hp -= 100;
Debug.Log("AttackDamage");
}
これで無事にダメージの方は反映できた。
DeerAtackManagerを削除して欲しいというエラーとEnvPlaymove5photonスクリプトにてDestroy(this.gameObject); に直っていなかったので攻撃側が消されてしまっていた。ここも修正。photonView.RPC(nameof(DestroyObj), RpcTarget.All);でdestroy処理もRPC同期。
ダメージ判定も時間クールダウンを設け、1ダメージずつ食らわせるようにした。
SoulPostの領域に入り、テキストのボタンが押せなかったのでcanvas sort orderを確認したところ、deer canvasのsort orderよりも小さくなっていたため押すことができなかった。sort orderの値を10まで増やすことでpanelの開閉がスムーズにできるようになった。
またGolemSoulCounterのSoulCounterminus()メソッドに0でない場合という条件を加え、dropitemがnullじゃない場合という条件も GolemSouldropスクリプトのDropgolemitem()メソッドもcountの値を参照するようにした。
Panel表示が対象以外のシーンにも表示されているため、自身のシーンのみで実行されるように変更する。