Unity3D 客户端无法生成预制件
Unity3D Client cannot spawn prefab
我正在通过网络制作射击游戏,它与以下源代码配合得很好。
player.cs
void Update(){
if (!isLocalPlayer) {
return;
}
if (Input.GetMouseButton(0)) {
CmdDefaultAttack(_skillDefault);
}
}
[Command]
protected void CmdDefaultAttack(GameObject _attackObject) {
GameObject bullet = (GameObject)Instantiate(_attackObject,_skill_Default_Spawn.position, _skill_Default_Spawn.rotation);
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6.0f;
ClientScene.RegisterPrefab(bullet);
NetworkServer.Spawn(bullet);
Destroy(bullet, 2);
}
但我想做的是在另一个 class 继承接口中实现 CmdDefaultAttack 并从 Player.cs
调用它
来源如下
public interface ISkill {
void initiate(Player _player);
void CmdAttack();
bool CmdMotion();
}
public class SphereSkillDefault : NetworkBehaviour, ISkill {
Plyaer player;
public GameObject _skill_Default_Level1;
public GameObject _skill_Default_Cannon
public void initiate(Player_player) {
this.player = _player;
}
[Command]
public void CmdAttack() {
GameObject bullet = (GameObject)Instantiate(_skill_Default_Level1, player._skill_Default_Spawn.position, player._skill_Default_Spawn.rotation);
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6.0f;
NetworkServer.Spawn(bullet);
Destroy(bullet, 2);
}
}
player.cs
ISkill _Idefaultattack;
public GameObject _defaultattack;
void Start() {
if (NetworkServer.active)
Debug.Log("Actived");
else
Debug.Log("DeActived");
if (isLocalPlayer) {
_Idefaultattack = _defaultattack.GetComponent<SphereSkillDefault>();
_Idefaultattack.initiate(this);
}
}
void Update() {
if (!isLocalPlayer) {
return;
}
_Idefaultattack.CmdAttack();
}
问题是当我尝试发射子弹时,它会抛出错误消息 "network server is not active. cannot spawn objects without an active server."
并且只有服务器玩家可以发射子弹,并且它实际上显示给客户端。
但是客户端只能在自己这边拍摄,不会显示给其他客户端或服务器。
我被这个问题困了好几天了。任何人都可以给我任何建议吗?
谢谢。
这个问题是直接调用其他class。所以,你需要桥接功能。
我已经写了来源。
ISkill _Idefaultattack;
public GameObject _defaultattack;
void Start() {
if (NetworkServer.active)
Debug.Log("Actived");
else
Debug.Log("DeActived");
if (isLocalPlayer) {
_Idefaultattack = _defaultattack.GetComponent<SphereSkillDefault>();
_Idefaultattack.initiate(this);
}
}
void Update() {
if (!isLocalPlayer) {
return;
}
//_Idefaultattack.CmdAttack();
CmdAck();
}
[Command]
void CmdAck(){
_Idefaultattack.CmdAttack();
}
我正在通过网络制作射击游戏,它与以下源代码配合得很好。
player.cs
void Update(){
if (!isLocalPlayer) {
return;
}
if (Input.GetMouseButton(0)) {
CmdDefaultAttack(_skillDefault);
}
}
[Command]
protected void CmdDefaultAttack(GameObject _attackObject) {
GameObject bullet = (GameObject)Instantiate(_attackObject,_skill_Default_Spawn.position, _skill_Default_Spawn.rotation);
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6.0f;
ClientScene.RegisterPrefab(bullet);
NetworkServer.Spawn(bullet);
Destroy(bullet, 2);
}
但我想做的是在另一个 class 继承接口中实现 CmdDefaultAttack 并从 Player.cs
调用它来源如下
public interface ISkill {
void initiate(Player _player);
void CmdAttack();
bool CmdMotion();
}
public class SphereSkillDefault : NetworkBehaviour, ISkill {
Plyaer player;
public GameObject _skill_Default_Level1;
public GameObject _skill_Default_Cannon
public void initiate(Player_player) {
this.player = _player;
}
[Command]
public void CmdAttack() {
GameObject bullet = (GameObject)Instantiate(_skill_Default_Level1, player._skill_Default_Spawn.position, player._skill_Default_Spawn.rotation);
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 6.0f;
NetworkServer.Spawn(bullet);
Destroy(bullet, 2);
}
}
player.cs
ISkill _Idefaultattack;
public GameObject _defaultattack;
void Start() {
if (NetworkServer.active)
Debug.Log("Actived");
else
Debug.Log("DeActived");
if (isLocalPlayer) {
_Idefaultattack = _defaultattack.GetComponent<SphereSkillDefault>();
_Idefaultattack.initiate(this);
}
}
void Update() {
if (!isLocalPlayer) {
return;
}
_Idefaultattack.CmdAttack();
}
问题是当我尝试发射子弹时,它会抛出错误消息 "network server is not active. cannot spawn objects without an active server."
并且只有服务器玩家可以发射子弹,并且它实际上显示给客户端。 但是客户端只能在自己这边拍摄,不会显示给其他客户端或服务器。
我被这个问题困了好几天了。任何人都可以给我任何建议吗?
谢谢。
这个问题是直接调用其他class。所以,你需要桥接功能。 我已经写了来源。
ISkill _Idefaultattack;
public GameObject _defaultattack;
void Start() {
if (NetworkServer.active)
Debug.Log("Actived");
else
Debug.Log("DeActived");
if (isLocalPlayer) {
_Idefaultattack = _defaultattack.GetComponent<SphereSkillDefault>();
_Idefaultattack.initiate(this);
}
}
void Update() {
if (!isLocalPlayer) {
return;
}
//_Idefaultattack.CmdAttack();
CmdAck();
}
[Command]
void CmdAck(){
_Idefaultattack.CmdAttack();
}