そのため、スクリプトが実行されているプレーヤーのヘルス ポイントを撤回するために呼び出される関数を持つプレーヤー ヘルス スクリプトがあります。
したがって、PlayerOnes のヘルス スクリプトは彼のヘルスを追跡し、PlayerTwo は彼のヘルスを追跡します。
弾丸の衝突が検出されると、衝突したオブジェクトのヘルス スクリプトから takedamage が呼び出されます。したがって、ダメージを受けます。NPC では機能しますが、ネットワーク プレイヤーでは機能しません。
P1 が ---> P2 を 2 回撃った場合、50 のダメージを受け、次に再び 50 のダメージを受けますが、死者を出さず、プレイヤーにヒットを記録しません。つまり、プレイヤーがダメージを受けないためです。ヒットポイントは 0 であるため、衝突を検出するだけで何もしません。ただし、残りのコードは実行せず、プレーヤーの位置などを変換しません。スクリプトは両方のコンピューターで実行され、両方で衝突が検出されるため、ネットワークに接続されているかどうかに関係なく、それを検出して更新を実行し、登録する必要があります。
何か案は?
using UnityEngine;
using System.Collections;
public class Health : MonoBehaviour {
public float hitPoints = 100;
public Transform explosionPrefab;
private Transform explosion;
public float currentHitPoints;
SpawnSpot[] spawnSpots;
private bool dead = false;
GameObject deadZone;
// Use this for initialization
void Start () {
currentHitPoints = hitPoints;
spawnSpots = GameObject.FindObjectsOfType<SpawnSpot> ();
}
// Update is called once per frame
void Update () {
if (currentHitPoints <= 0) {
deadZone = GameObject.FindWithTag("DeadZone");
gameObject.transform.position = deadZone.transform.position;
dead = true;
Instantiate(explosionPrefab, gameObject.transform.position, gameObject.transform.rotation);
}
if (dead) {
if (currentHitPoints <= 0){
//if (gameObject.transform.name == "Player"{
SpawnSpot mySpawnSpot = spawnSpots [Random.Range (0, spawnSpots.Length)];
Debug.Log (gameObject.transform.name + "Your DEAD");
if (Input.GetButtonDown ("Fire1")) {
gameObject.transform.position = mySpawnSpot.transform.position;
currentHitPoints = 100;
}
}
}
}
[RPC]
public void TakeDamage(float amt){
currentHitPoints -= amt;
Debug.Log ("taking damage");
if (currentHitPoints <= 0) {
Die();
}
}