Exemplo n.º 1
0
    private static void CreateNewBullet(int id, Transform master, int layer,BulletDeploy deploy, CreatedNotify notify)
    {
        GameSystem.CoroutineStart(TextureUtility.LoadResourceById(deploy.resourceId, spriteList =>
        {
            int spriteIdx = deploy.spriteIdx;
            if(deploy.spriteIdx > spriteList.Count)
            {
                spriteIdx = 0;
            }
            var sprite = spriteList[spriteIdx];
            Holder holder;
            if (!CachePool.TryGetValue(id, out holder))
            {
                holder = new Holder
                {
                    Deploy = deploy,
                    Resource = sprite,
                    SpriteList = spriteList,
                    Queue = new Queue<Bullet>()
                };
                CachePool.Add(id, holder);
            }

            CreateBulletDirect(spriteList, sprite, deploy, master, layer, bullet =>
            {
                notify(bullet);
            });
        }));
    }
Exemplo n.º 2
0
 public virtual void Init(BulletDeploy deploy, Transform master, MeshRenderer renderer)
 {
     Deploy   = deploy;
     Master   = master;
     Renderer = renderer;
     _isAni   = deploy.isAni;
     ReInit(master);
 }
Exemplo n.º 3
0
    public override void Init(BulletDeploy deploy, Transform master, MeshRenderer model)
    {
        _material = model.material;
        base.Init(deploy, master, model);

        //初始化被击特效
        TextureEffectFactroy.CreateEffect(HitEffectId, SortingOrder.Effect, e =>
        {
            _hitEffect = e;
            _hitEffect.SetActiveSafe(false);
        });
    }
Exemplo n.º 4
0
    private static void CreateBulletDirect(List<Sprite> spriteList, Sprite resource, BulletDeploy deploy, Transform master, int layer,  Action<Bullet> notify)
    {
        Type type = null;

        var bulletClass = deploy.classType;
        if (!string.IsNullOrEmpty(bulletClass))
            if ((type = Common.GetType(bulletClass)) == null)
                Debug.LogError("bullet class : " + bulletClass + " not exist");

        if (type == null) type = typeof(Bullet);

        var _object = new GameObject("bullet_" + deploy.id);
        _object.transform.localScale = deploy.scale * Vector3.one;

        var model = new GameObject("model");
        model.transform.SetParent(_object.transform, false);
        model.AddComponent<MeshFilter>().sharedMesh = GameSystem.DefaultRes.QuadMesh;

        Material material;
        if (!BulletMaterialCache.TryGetValue(deploy.id, out material))
        {
            material = new Material(GameSystem.DefaultRes.CommonShader);
            material.mainTexture = resource.texture;
            material.SetFloat("_AlphaScale", deploy.alpha);
            material.SetFloat("_Brightness", deploy.brightness);
            

            BulletMaterialCache[deploy.id] = material;
        }

        var mr = model.AddComponent<MeshRenderer>();
        mr.sharedMaterial = material;

        switch (layer)
        {
            case Layers.PlayerBullet:
                mr.sortingOrder = SortingOrder.PlayerBullet;
                break;
            case Layers.EnemyBullet:
                mr.sortingOrder = SortingOrder.EnemyBullet;
                break;
            case Layers.Ui:
                mr.sortingOrder = SortingOrder.Top;
                break;
        }

        model.transform.localEulerAngles = new Vector3(0, 0, deploy.rota);

        var sizeX = resource.bounds.size.x;
        var sizeY = resource.bounds.size.y;
        if (deploy.sizeX > 0 && deploy.sizeY > 0)
        {
            sizeX = deploy.sizeX;
            sizeY = deploy.sizeY;
        }

        model.transform.localScale = new Vector3(sizeX, sizeY, 1);

        //中心点位置
        var bRota = (int)deploy.rota % 90 == 0;
        if(deploy.centerPivot == 1)
        {
            model.transform.localPosition = new Vector3(0, bRota ? sizeX / 2f : sizeY / 2f, 0);
        }
        else if(deploy.centerPivot == 2)
        {
            model.transform.localPosition = new Vector3(0, -(bRota ? sizeX / 2f : sizeY / 2f), 0);
        }

        var collisionInfo = new Bullet.ColliderInfo();
        //加collider
        if(deploy.isBoxCollider)
        {
            collisionInfo.IsBox = true;
            collisionInfo.BoxWidth = (bRota ? sizeY : sizeX) * deploy.radius;
            collisionInfo.BoxHeight = (bRota ? sizeX : sizeY) * deploy.radius;
            collisionInfo.Center = model.transform.localPosition;
        }
        else if (deploy.radius  > 0)
        {
            collisionInfo.IsBox = false;
            collisionInfo.Radius = deploy.radius;
            collisionInfo.Center = model.transform.localPosition;
        }

        var bullet = _object.AddComponent(type) as Bullet;
        if (!bullet)
        {
            Debug.LogError("CreateBulletDirect, Object is null 222");
            Object.Destroy(_object);
        }
        else
        {
            bullet.CollisionInfo = collisionInfo;
            bullet.gameObject.layer = layer;
            bullet.Init(deploy, master, mr);
        }

        //ani
        if (deploy.isAni)
        {
            bullet.AniList = spriteList;
        }

        notify(bullet);
    }