예제 #1
0
        /// <summary>
        /// Parses a substring from an bullet file name, determines which property that substring represents, and assigns the corresponding enum
        /// </summary>
        /// <param name="bulletObject">original bullet object</param>
        /// <param name="bulletSubstring">substring taken from an bullet's filename e.g. arg, xl, or mk2</param>
        /// <returns>object with the new property added</returns>
        private BulletModel ParseBulletSubstring(BulletModel bulletObject, string bulletSubstring)
        {
            if (bulletObject.Version == null && int.TryParse(bulletSubstring, out int bulletVersion))
            {
                bulletObject.Version = bulletVersion;
                return(bulletObject);
            }

            if (bulletObject.Faction == null && Enum.TryParse(bulletSubstring, true, out FactionType bulletFaction))
            {
                bulletObject.Faction = bulletFaction;
                return(bulletObject);
            }

            if (bulletObject.Size == null && Enum.TryParse(bulletSubstring, true, out BulletSize bulletSize))
            {
                bulletObject.Size = bulletSize;
                return(bulletObject);
            }

            if (bulletObject.Type == null && Enum.TryParse(bulletSubstring, true, out BulletType bulletType))
            {
                bulletObject.Type = bulletType;
                return(bulletObject);
            }

            if (bulletObject.Grade == null && Enum.TryParse(bulletSubstring, true, out BulletGrade bulletGrade))
            {
                bulletObject.Grade = bulletGrade;
                return(bulletObject);
            }

            throw new Exception($"Failed to parse bullet substring \"{bulletSubstring}\"");
        }
예제 #2
0
        private BulletModel SerializeToBulletModel(BaseGraph graph, BulletGraphAsset asset)
        {
            List <Bullet_Node> rootNodes = NodeHelper.GetNodes <Bullet_Node>(graph);

            if (rootNodes.Count <= 0)
            {
                Debug.LogError($"试图序列化出错,没有根节点");
            }
            Bullet_Node node = rootNodes[0];

            BulletModel buletModel = new BulletModel();

            buletModel.id               = asset.bulletId;
            buletModel.asset            = node.asset;
            buletModel.radius           = node.radius;
            buletModel.hitTimes         = node.hitTimes;
            buletModel.sameTargetDelay  = node.sameTargetDelay;
            buletModel.removeOnObstacle = node.removeOnObstacle;
            buletModel.hitEnemy         = node.hitEnemy;
            buletModel.hitFriend        = node.hitFriend;

            buletModel.moveFunc      = node.GetMoveFunc();
            buletModel.catchFunc     = node.GetCatchFunc();
            buletModel.onCreateFunc  = node.GetOnCreateFuncs();
            buletModel.onRemovedFunc = node.GetOnRemovedFuncs();
            buletModel.onHitFunc     = node.GetOnHitFuncs();

            return(buletModel);
        }
        public override AbstractFiringPattern Exec()
        {
            double i = start, j = stop, tempRadius = 5;

            firingrate = 65;
            texture    = TextureNames.LaserBullet;

            while (i < j)
            {
                var invis1 = MainContent.ModelFactory.BuildGenericModel(TextureNames.Invisible, start, stop, fromModel.GetLocation(), fromModel);
                invis1.SetOrbitAngle(0);
                invis1.SetSourceModel(fromModel);
                invis1.SetOrbitSpeed(10);
                invis1.SetOrbitRadius(tempRadius);
                MainContent.Events.AddScheduledTaggedEvent(start, stop, fromModel, () => invis1.MoveOrbit());

                var invis2 = MainContent.ModelFactory.BuildGenericModel(TextureNames.Invisible, start, stop, fromModel.GetLocation(), fromModel);
                invis2.SetOrbitAngle(180);
                invis2.SetSourceModel(fromModel);
                invis2.SetOrbitSpeed(10);
                invis2.SetOrbitRadius(tempRadius);
                MainContent.Events.AddScheduledTaggedEvent(start, stop, fromModel, () => invis2.MoveOrbit());

                var t1 = invis1.GetLocation();
                var t2 = invis1.GetLocation();

                //first bullet.
                BulletModel bullet1 = MainContent.ModelFactory.BuildEnemyBulletModel(texture, i, i + bulletLife, t1, fromModel);
                bullet1.SetRate(speed);
                bullet1.SetSourceModel(invis1);

                bullet1.SetDestinationModel(MainContent.PlayerShip);
                MainContent.Events.AddSingleTaggedEvent(i, fromModel, () => bullet1.SetLocationFromSourcetModel());
                MainContent.Events.AddSingleTaggedEvent(i, fromModel, () => bullet1.SetAngleFromDestinationModel());
                MainContent.Events.AddScheduledTaggedEvent(i, i + bulletLife, fromModel, () => bullet1.MoveLinearAngle());

                //second bullet.
                BulletModel bullet2 = MainContent.ModelFactory.BuildEnemyBulletModel(texture, i, i + bulletLife, t2, fromModel);
                bullet2.SetRate(speed);
                bullet2.SetSourceModel(invis2);

                bullet2.SetDestinationModel(MainContent.PlayerShip);
                MainContent.Events.AddSingleTaggedEvent(i, fromModel, () => bullet2.SetLocationFromSourcetModel());
                MainContent.Events.AddSingleTaggedEvent(i, fromModel, () => bullet2.SetAngleFromDestinationModel());
                MainContent.Events.AddScheduledTaggedEvent(i, i + bulletLife, fromModel, () => bullet2.MoveLinearAngle());

                i += 1 / firingrate;

                if (tempRadius > 75)
                {
                    continue;
                }
                else
                {
                    tempRadius += .5;
                }
            }

            return(this);
        }
예제 #4
0
    public BulletController SpawnBulletType()
    {
        BulletModel      bulletModel      = new BulletModel(bulletLists.bullets[tankService.tank_no]);
        BulletController bulletController = new BulletController(bulletModel, bulletView);

        return(bulletController);
    }
예제 #5
0
    public void Shoot(int i)
    {
        // animator.SetInteger("Shoot", i);
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
        var point = GetPoint(ray.GetPoint(0), ray.direction, Vector3.up, new Vector3(0, hitPoint.y, 0));

        realPosition = new Vector3(point.x, transform.position.y, point.z);
        isShoot      = true;
        //SetRotation(realPosition);
        if (i < 30)
        {
            return;
        }
        BulletModel bulletModel = new BulletModel()
        {
            Count = 3, Speed = 5, Angle = 30
        };

        bulletModel.Set(hitPoint, transform.rotation); // , Count, LifeTime, BulletSpeed, Angle, Distance

        if (LimitI > CdTime * 50)
        {
            BulletManager.Instance.DoShoot(bulletModel, bulletPool);
            LimitI = 0;
        }
    }
예제 #6
0
    //public static BulletManager Instance;

    //void Awake()
    //{
    //    Instance = this;
    //}

    /// <summary>
    /// 发射子弹
    /// </summary>
    /// <param name="bulletModel"></param>
    /// <param name="pool"></param>
    public void DoShoot(BulletModel bulletModel, BasePool pool)
    {
        int num = bulletModel.Count / 2;

        for (int i = 0; i < bulletModel.Count; i++)
        {
            GameObject go         = pool.Get(bulletModel.InitPosition, bulletModel.LifeTime); //从对象池中获取 // 初始位置即enemy当前位置
            BulletMove bulletMove = go.GetComponent <BulletMove>();
            var        render     = go.GetComponent <MeshRenderer>();
            if (render != null)
            {
                go.GetComponent <MeshRenderer>().material?.SetColor("_EmissionColor", bulletModel.Color);
            }
            bulletMove.BulletSpeed = bulletModel.Speed;
            bulletMove.DelayTime   = bulletModel.DelayTime;

            if (bulletModel.Count % 2 == 1)
            {
                go.transform.rotation = bulletModel.Direction * Quaternion.Euler(0, 0, -(bulletModel.Angle * num)); // 绕Z轴旋转 , 要带负号
                go.transform.position = go.transform.position + go.transform.right * num * bulletModel.Distance;
                num--;
            }
            else
            {
                go.transform.rotation = bulletModel.Direction * Quaternion.Euler(0, 0, -(bulletModel.Angle / 2 + bulletModel.Angle * (num - 1)));  // 绕Z轴旋转
                go.transform.position = go.transform.position + go.transform.right * ((num - 1) * bulletModel.Distance + bulletModel.Distance / 2);
                num--;
            }
            go.transform.position = go.transform.position + go.transform.forward * bulletModel.ShiftInitPos;
        }
    }
예제 #7
0
        public override AbstractFiringPattern Exec()
        {
            double i = start;

            speed      = 2;
            firingrate = 1000;                      //default firing rate.
            angle      = rnd.Next(0, 360);          //generate random angle for laser.

            while (i < stop)                        //Similar to Laser, just with increasing speed for each subsequent bullet.
            {
                var t = fromModel.GetLocation();
                speed += .5;

                BulletModel bullet = MainContent.ModelFactory.BuildEnemyBulletModel(TextureNames.LaserBullet, i, i + bulletLife, t, fromModel);
                bullet.SetLinearTravelAngle(angle);
                bullet.SetRate(speed);
                bullet.SetSourceModel(fromModel);
                bullet.SetDestinationModel(MainContent.PlayerShip);
                MainContent.Events.AddSingleTaggedEvent(i, fromModel, () => bullet.SetLocationFromSourcetModel());
                MainContent.Events.AddScheduledTaggedEvent(i, i + bulletLife, fromModel, () => bullet.MoveLinearAngle());


                scheduledEvents.Add(new GameEvents.Event(start, stop, bullet));
                i += 1 / firingrate;
            }

            return(this);
        }
예제 #8
0
        /// <summary>
        /// Populates an bullet object for a given bullet file path
        /// </summary>
        /// <param name="bulletFilePath"></param>
        /// <returns></returns>
        public BulletModel PopulateBullet(string bulletFilePath)
        {
            string        bulletFileName         = Path.GetFileName(bulletFilePath);
            List <string> bulletFileNameSubParts = bulletFileName.Split('_').ToList();

            bulletFileNameSubParts.Remove("bullet");
            bulletFileNameSubParts.Remove("macro.xml");

            BulletModel bullet = new BulletModel();

            bullet.WeaponType = DetermineBulletWeaponType(bulletFileNameSubParts);
            if (bullet.WeaponType == BulletWeaponType.turret)
            {
                bulletFileNameSubParts.Remove("turret");
            }
            bulletFileNameSubParts = RemoveMultitermBulletFileNameParameters(bulletFileNameSubParts);

            bulletFileNameSubParts.ForEach(x => bullet = ParseBulletSubstring(bullet, x));

            XmlDocument bulletXml = new XmlDocument();

            bulletXml.Load(bulletFilePath);
            bullet.Properties = ParseBulletPropertiesXml(bulletXml);

            bullet.Faction ??= FactionType.GEN;

            bullet.Name = GenerateBulletName(bullet).Trim();

            return(bullet);
        }
예제 #9
0
 public void RemoveBullet(BulletModel bullet)
 {
     EnemyBulletList.Remove(bullet);
     Events.RemoveFutureTaggedEvents(bullet);
     Events.RemoveAllTaggedEvents(bullet.GetHashCode() + "static".GetHashCode());
     enemyBulletList = EnemyBulletList.Except(RemoveBullet(bullet.GetHashCode() + "static".GetHashCode())).ToList();
 }
        public override AbstractFiringPattern Exec()
        {
            double i = 1;

            var invis1 = MainContent.ModelFactory.BuildGenericModel(TextureNames.Invisible, start, stop, fromModel.GetLocation(), fromModel);

            invis1.SetSourceModel(fromModel);
            //MainContent.Events.AddScheduledTaggedEvent(start, stop, fromModel, () => invis1.MoveOrbit());

            while (i < 360)
            {
                BulletModel bullet = MainContent.ModelFactory.BuildEnemyBulletModel(texture,
                                                                                    fromModel.StartLife,
                                                                                    fromModel.EndLife, invis1.GetLocation(), fromModel);
                bullet.SetOrbitAngle(i);
                bullet.SetSourceModel(invis1);
                bullet.SetOrbitSpeed(speed);
                bullet.SetRate(speed);
                double tag    = fromModel.GetHashCode() + "static".GetHashCode();
                double middle = (start + stop) / 2;
                MainContent.Events.AddScheduledTaggedEvent(start, stop, tag, () => bullet.MoveOrbit());
                MainContent.Events.AddScheduledTaggedEvent(start, start + 1, tag, () => bullet.IncrementOrbitRadius());
                MainContent.Events.AddScheduledTaggedEvent(start + 1, middle, tag, () => bullet.DecrementOrbitRadius());
                MainContent.Events.AddScheduledTaggedEvent(middle + 1, stop, tag, () => bullet.ToggleOrbitRate());
                MainContent.Events.AddSingleTaggedEvent(start, TextureNames.Invisible, () => invis1.SetLocationFromSourcetModel());

                i += density;

                scheduledEvents.Add(new GameEvents.Event(start, stop, bullet));
            }

            return(this);
        }
예제 #11
0
 //тригеры для пули
 public void TriggerBulletDeath(Collider other, BulletModel model, GameObject obj)
 {
     if (other.CompareTag("DeathZone") || other.CompareTag("Asteroid"))
     {
         tmpBullet = obj;
         app.model.delBulletCollection(model);
     }
 }
예제 #12
0
        public IBullet CreateBullet(IAttackable attackable)
        {
            var         presenter = GameObject.Instantiate(originalBulletObject);
            BulletModel model     = new BulletModel(attackable, levelData);

            presenter.Initialize(model);
            return(model);
        }
예제 #13
0
 public PlayerModel(ILevelData levelData, IStage stage)
 {
     this.levelData       = levelData;
     this.stage           = stage;
     originalBulletObject = levelData.PlayerBullet;
     moveVelocity         = levelData.PlayerMoveVelocity;
     position.Value       = new Vector2(0, -2.3f);
 }
예제 #14
0
 public BulletController(BulletModel model, Transform spawnPoint, EnemyController target, int turretLevel)
 {
     _model       = model;
     _view        = BulletFactory.InstantiateView(spawnPoint, _model.PrefabName, this);
     _target      = target;
     _model.Level = turretLevel;
     _target.AddObserver(this);
 }
예제 #15
0
    public BulletsPool(BulletModel bulletModel, BulletView bulletView, Transform poolsParent)
    {
        _bulletModel = bulletModel;
        _bulletView  = bulletView;

        PoolManager.SetRoot(poolsParent);
        PoolManager.WarmPool(_bulletView.gameObject, _bulletModel.BulletsCountInPool);
    }
        public void CreateBullet(Vector3 position, Quaternion rotation, BulletScriptableObject type)
        {
            BulletScriptableObject bullet           = type;
            BulletModel            bulletModel      = new BulletModel(bullet);
            BulletController       bulletController = new BulletController(bulletModel, bullet.BulletView, position, rotation);

            bullets.Add(bulletController);
        }
예제 #17
0
    public BulletController SpawnBullet()
    {
        BulletScriptableObjects bulletScriptableObject = bulletConfig[0];
        BulletModel             BulletModel            = new BulletModel(bulletScriptableObject);
        BulletController        BulletController       = new BulletController(BulletModel, bulletPrefab);

        return(BulletController);
    }
예제 #18
0
        // Good bullet factories
        public BulletModel BuildGoodBulletModel(string texture, double startTime, double stopTime,
                                                Point startPosition)
        {
            var gm = new BulletModel(startPosition, 3, MainContent.Textures[TextureNames.GoodBullet]);

            TimeToLiveTagged(startTime, stopTime, gm, gm);
            gm.SetLifespan(startTime, stopTime);
            return(gm);
        }
예제 #19
0
        // Enemy bullet factories
        public BulletModel BuildEnemyBulletModel(string texture, double startTime, double stopTime, Point startPosition,
                                                 BaseModel source)
        {
            var bm = new BulletModel(startPosition, 3, MainContent.Textures[texture]);

            TimeToLiveTagged(startTime, stopTime, source, bm);
            bm.SetLifespan(startTime, stopTime);
            return(bm);
        }
예제 #20
0
    private DanmakuBullet CreateBullet(BulletModel bulletModel)
    {
        // Core GameKit Integration

        Transform     bulletTransform = PoolBoss.Spawn(ProjectilePrefab.transform, new Vector3(0, 0, 0), new Quaternion(0, 0, 0, 0), PoolBoss.Instance.transform);
        DanmakuBullet bullet          = bulletTransform.GetComponentInChildren <DanmakuBullet>();

        return(bullet);
    }
예제 #21
0
        //модели зарегестрированные на игровой карте
        public void RegisterModelBullet(BulletModel bulletmodel)
        {
            ////даем уникальный ID
            //bulletmodel.BulletId = _registerBullets.Count();

            //_registerBullets.Enqueue(bulletmodel);

            _hubContext.Clients.All.instantiateBullet(bulletmodel);
        }
예제 #22
0
    public BulletController SpawnBullet(Vector3 bulletPosition, Quaternion bulletRotation)
    {
        Debug.Log("spawningBullet");

        BulletModel      bulletModel      = new BulletModel(bulletScriptableObjectList.bulletList[0]);
        BulletController bulletController = new BulletController(bulletModel, bulletView, bulletPosition, bulletRotation);

        return(bulletController);
    }
예제 #23
0
    public BulletController(BulletModel model, BulletView view)
    {
        _view = view;

        // Bind Model
        model.Velocity.Subscribe(v => _view.SetVelocity(v));

        // Bind View
        view.TriggerEnterEvents.Subscribe(_ => Destroy());
    }
        public BulletController(BulletModel bulletModel, BulletView bulletPrefab, Vector3 position, Quaternion rotation)
        {
            BulletModel = bulletModel;
            BulletView  = GameObject.Instantiate <BulletView>(bulletPrefab, position, rotation);

            //BulletView = GameObject.Instantiate<BulletView>(bulletPrefab);
            BulletView.SetBulletController(this);
            BulletModel.SetBulletController(this);
            rigidBody = BulletView.GetComponent <Rigidbody>();
        }
예제 #25
0
    public void init(Tower t)
    {
        this.owner = t;

        var modelObject = GameObject.CreatePrimitive(PrimitiveType.Quad);               // Create a quad object for holding the gem texture.

        model = modelObject.AddComponent <BulletModel>();                               // Add a towerModel script to control visuals of the gem.
        model.transform.parent = transform.parent;
        model.init(this);
    }
예제 #26
0
 public void setModel(BulletModel model)
 {
     bulletModel = model;
     bulletModel.Position
     .ObserveEveryValueChanged(x => x.Value)
     .Subscribe(xs =>
     {
         transform.position = xs;
     }).AddTo(disposables);
 }
예제 #27
0
    public BulletController(BulletModel bulletModel, BulletView bulletPrefab)
    {
        BulletView = GameObject.Instantiate <BulletView>(bulletPrefab);
        //Rigidbody instBulletRigidBody = BulletView.GetComponent<Rigidbody>();
        //instBulletRigidBody.AddForce(Vector3.forward * TankModel.BulletSpeed);
        //Debug.Log("Speed "+TankModel.Speed);

        BulletModel = bulletModel;
        BulletView.InitBulletController(this);
    }
예제 #28
0
 public TurretModel(float range, float fireRate, string prefabName, BulletModel bullet, int price)
 {
     _range        = range;
     _fireRate     = fireRate;
     _prefabName   = prefabName;
     _bullet       = bullet;
     _level        = 1;
     _upgradeCoeff = 0.25f;
     _price        = price;
 }
예제 #29
0
    /// <summary>
    /// awake位置应当在屏幕外
    /// </summary>
    void Awake()
    {
        Curve       = new AnimationCurve();
        bulletModel = new BulletModel()
        {
            Count = 6, Speed = 10, Angle = 60
        };
        GameObject bullet = Resources.Load <GameObject>("Prefabs/Bullet");

        bulletPool = GameObjectPoolManager.Instance.CreatGameObjectPool <BasePool>("Prefabs/Bullet", bullet);
    }
예제 #30
0
 public BulletFactory(Vector2 position)
 {
     View = GameObject.Instantiate(
         Refs.Instance.BulletViewPrefab,
         position,
         Quaternion.identity,
         Refs.Instance.Gameplay
         );
     Model      = new BulletModel();
     Controller = new BulletController(Model, View);
 }