0

ゲームで銃のプレハブからコマンドを送信できません。ノンプレイヤー ゲーム オブジェクトからコマンドを送信するにはどうすればよいですか? コマンドを送信しようとするたびに、エラーが発生します。シューティング スクリプトを銃からプレーヤーに移動したくありません。この方法では、ゲームを大幅に変更する必要があるためです。

私の撮影スクリプト:

[Command]
    void CmdOpenFire(){


    if (Physics.Raycast(camTransform.TransformPoint(startPosition), camTransform.forward, out hit, range)){
        gunsMasterScript.CallEventShotDefault(hit.point, hit.transform);
        if (hit.transform.parent != null) {
            if (hit.transform.parent.CompareTag ("Enemy")) {

                gunsMasterScript.CallEventShotEnemy (hit.point, hit.transform.parent);
            }
        }


        if (hit.transform.tag == "Player") {
            gunsMasterScript.CallEventShotEnemy (hit.point, hit.transform);
        }
    }

}

私の撮影検出スクリプト:

public PlayerManager_AmmoBox localPlayerTester;
public GunsManager_GunsAmmo gunsAmmo;
public GunsManager_GunsMaster gunMaster;
float nextAttack;
public float attackRate = 0.5f; 
Transform myTransform;
public bool isAutomatic = true;
public bool hasBurstFire;
bool isBurstFireActive;
public string attackButtonName;
public string reloadButtonName;
public string burstFireButtonName;
NetworkIdentity netID;

// Use this for initialization
void OnEnable () {
    if (transform.root != null) {
        if (transform.root.GetComponent<PlayerManager_AmmoBox> () != null) {
            localPlayerTester = transform.root.GetComponent<PlayerManager_AmmoBox> ();
        }
    }
    SetInitialReferences ();

}

// Update is called once per frame
void Update () {
    if (localPlayerTester != null) {
        CheckIfWeaponShouldAttack ();
        CheckForReloadRequest ();
        CheckForBurstFireToggle ();
    }

}
void SetInitialReferences(){
    netID = GetComponent<NetworkIdentity> ();
    myTransform = transform;
    gunMaster = transform.GetComponent<GunsManager_GunsMaster> ();
    gunsAmmo = transform.GetComponent<GunsManager_GunsAmmo> ();
     gunMaster.isGunLoaded = true; 
}


void CheckIfWeaponShouldAttack(){

    if (gunMaster != null) {
        if (Time.time > nextAttack && Time.timeScale > 0 && myTransform.root.CompareTag ("Player") && gunMaster.isGunLoaded) {


                if (isAutomatic && !isBurstFireActive) {
                if (Input.GetButton (attackButtonName)) {
                    AttemptAttack ();
                }

            } else if (isAutomatic && isBurstFireActive) {
                if (Input.GetButtonDown (attackButtonName)) {
                    StartCoroutine (RunBurstFire ());

                }

            } else if (!isAutomatic) {

                if (Input.GetButton (attackButtonName)) {
                    AttemptAttack ();
                }
            }

        }
    }
}

void AttemptAttack(){
    nextAttack = Time.time + attackRate;
    if (gunMaster.isGunLoaded) {

        gunMaster.CallEventPlayerInput ();

    } else {

        gunMaster.CallEventGunNotUsable ();
    }
}
4

1 に答える 1

1

コマンドは、特定のプレイヤーに関連付けられているゲームオブジェクト (NetworkBehavior を持つ) で呼び出す必要があります。したがって、非プレイヤー オブジェクトから呼び出すことはできないと思います。

ただし、銃のスクリプトをプレーヤー上のスクリプト (プレーヤーの接続に関連付けられている NetworkBehavior であるスクリプト) と通信させることもできます。これにより、エラーが停止します。(この通信は、SendMessage またはプレーヤー オブジェクトへの通常の関数呼び出しを介して行うことができます。)

結論として、現在、UNet はプレイヤー以外のオブジェクトからのコマンドを許可していないため、コマンドを使用するには、プレイヤー/ガン スクリプトのレイアウトを変更する必要があります。ただし、これはわずか数行のコードで、ガン スクリプトをプレーヤー スクリプト (プレーヤーの接続に関連付けられている NetworkBehavior から継承するスクリプト) と "対話" させるだけで実行できます。

コマンドの詳細については、 https ://docs.unity3d.com/ScriptReference/Networking.CommandAttribute.html を参照してください。

于 2016-06-26T19:45:54.687 に答える