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); }); })); }
public virtual void Init(BulletDeploy deploy, Transform master, MeshRenderer renderer) { Deploy = deploy; Master = master; Renderer = renderer; _isAni = deploy.isAni; ReInit(master); }
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); }); }
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); }