http://answers.unity3d.com/questions/32413/using-constructors-in-unity-c.html
那不能完全解决以下问题:


各种武器等级
服务器-客户端架构
服务器想要生成武器或弹丸,但是在此之前要设置哪个玩家射击,武器具有的等级等等。
WeaponScript应该处理所有效果,例如实例化本身


我可以这样做

GameObject fireball = (GameObject)GameObject.Instantiate(pfFireball, p.Position, p.Rotation);
FireBall fb = (FireBall)fireball.GetComponent(typeof(FireBall));
fb.agressorId = pId;
fb.weaponLevel = p.Controller.WeaponLevel;
networkView.RPC("ShootClientWeapon", RPCMode.All, (int)w, p.PlayerId);


但是,如果我想让我的武器处理其外观/实例化的逻辑该怎么办。例如,如果我有一种武器,其游戏对象直接在每个玩家的位置或攻击者的位置生成。失败。
我期望...

 fireball fb = new FireBall();
 fb.gameObject = prefabFireball;
 fb.agressorId = pId;
 fb.weaponLevel = p.Controller.WeaponLevel;
 fb.Fire();


有解决方法吗?
如果我使一个类不继承Monobehaviour,那么我的更新方法就消失了。但是,我唯一需要做的就是自己处理实例化。

最佳答案

您可能有一个从FireballBehavior继承的MonoBehavior和一个没有从任何继承的Fireball对象。

您的FireballBehavior将负责生成和杀死Fireball,并跟踪场景中的火球,另一方面,您的Fireball对象应完全由数据驱动,并且仅持有数据武器。

允许您在任何游戏对象上向服务器发送消息到FireballBehavior,该消息说“实例化该对象:Fireball”

我清楚吗?

class FireballBehavior : MonoBehavior {

    Fireball fireball;
    public void startFireball(Fireball frb) {
        fireball = frb;
        createFireball(); //instanciation and stuff
    }
    //your functions handling creation update and killing

}

class Fireball {

    GameObject gameObject = prefabFireball;
    Int agressorId = pId;
    Int weaponLevel = p.Controller.WeaponLevel;

}


这样,您就可以将消息从网络发送到:

 gameobject.GetComponent<FireballBehavior>().startFireball(frbFromServer);


总结:一种通用行为,它根据数据以及仅由服务器处理并从其发送的小类或结构中的所有数据进行更新和实例化

这种方法的优点是它是可互换的,并且由于Fireball是稳态对象,因此您可以序列化他或将他存储在数据库中而无需花费太多精力,只需进行少量更改,您就可以在执行过程中直接在FireballBehavior中更改Fireball对象在不同的时间有不同的火球...

这是从其中一个视频衍生而来的一个想法:(不记得是哪个视频了……但是两个都很好看)


Unite 2013 Scripting behind the scene
Unite 2013 Internal Unity tips and tricks


要完成答案,您甚至可以用一种非常通用的方法来完成:

class AnyObjectBehavior : MonoBehavior {

    AnyObject Object1;
    public void startFireball(anyObject frb) {
        Object1 = frb;
        initiateAnyObject (); //instanciation and stuff

    }
    //your functions handling creation update and killing

    private void initiateAnyObject () {

         myObjectList.add(Object1) //that way you do not have to
                                   // use for loops to edit some objects
         //instanciation stuff
    }

}

class AnyObject {
    //Generic properties
    GameObject gameObject = prefabFireball;

}

class Fireball : AnyObject
{
    //fireball specific properties
    Int agressorId = pId;
    Int weaponLevel = p.Controller.WeaponLevel;

}


这样,您可以为要实例化的任何对象类型添加新类,并始终使用相同的behaviorComponent来开始更新并杀死它们,甚至可以使用

List<anyObject> myObjectList = new List<anyObject>() {fireball, carrot, chicken}

09-25 17:15