Ejemplo n.º 1
0
    /// <summary>
    /// 使用组件进行移动参数变更,
    /// <para>具体参数参考AddParaChangeEvent方法</para>
    /// <para>bullet</para>
    /// <para>para MovePara</para>
    /// <para>changeMode 改变方式 ChangeTo,IncBy,DecBy,ChangeTo</para>
    /// <para>valueType 参数类型</para>
    /// <para>arg0 参数0</para>
    /// <para>arg1 参数1</para>
    /// <para>valueOffset 随机偏移量</para>
    /// <para>delay 起始延迟</para>
    /// <para>duration 变化持续时间</para>
    /// <para>intMode 插值方式</para>
    /// <para>repeatCount 重复次数</para>
    /// <para>repeatInterval 每次重复的间隔</para>
    /// <para>总计12个参数</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int AddBulletParaChangeEvent(ILuaState luaState)
    {
        EnemyBulletBase   bullet         = luaState.ToUserData(-12) as EnemyBulletBase;
        BulletParaType    para           = (BulletParaType)luaState.ToInteger(-11);
        ParaChangeMode    changeMode     = (ParaChangeMode)luaState.ToInteger(-10);
        int               valueType      = luaState.ToInteger(-9);
        float             arg0           = (float)luaState.ToNumber(-8);
        float             arg1           = (float)luaState.ToNumber(-7);
        float             valueOffset    = (float)luaState.ToNumber(-6);
        int               delay          = luaState.ToInteger(-5);
        int               duration       = luaState.ToInteger(-4);
        InterpolationMode intMode        = (InterpolationMode)luaState.ToInteger(-3);
        int               repeatCount    = luaState.ToInteger(-2);
        int               repeatInterval = luaState.ToInteger(-1);
        BCParasChange     bc             = bullet.AddOrGetComponent <BCParasChange>();
        ParaChangeValue   changeValue    = new ParaChangeValue
        {
            argType = valueType,
            arg0    = arg0,
            arg1    = arg1,
            offset  = valueOffset,
        };

        bc.AddParaChangeEvent(para, changeMode, changeValue, delay, duration, intMode, repeatCount, repeatInterval);
        return(0);
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 做加速运动(限制最大速度)
    /// <para>bullet 敌机子弹</para>
    /// <para>float acce 加速度</para>
    /// <para>float angle 速度方向 or bool useVAngle使用速度方向</para>
    /// <para>bool isAimToPlayer 是否朝向玩家</para>
    /// <para>float maxVelocity 最大速度限制</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int EnemyBulletDoAccelerationWithLimitation(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase;
        float           acce   = (float)luaState.ToNumber(-4);
        float           angle;

        if (luaState.Type(-3) == LuaType.LUA_TBOOLEAN)
        {
            bullet.GetBulletPara(BulletParaType.VAngel, out angle);
        }
        else
        {
            angle = (float)luaState.ToNumber(-3);
        }
        bool  isAimToPlayer = luaState.ToBoolean(-2);
        float maxVelocity   = (float)luaState.ToNumber(-1);

        luaState.Pop(5);
        if (isAimToPlayer)
        {
            Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition();
            angle += MathUtil.GetAngleBetweenXAxis(playerPos - bullet.GetPosition());
        }
        bullet.DoAccelerationWithLimitation(acce, angle, maxVelocity);
        return(0);
    }
Ejemplo n.º 3
0
    /// <summary>
    /// 设置敌机子弹的直线运动参数
    /// <para>bullet</para>
    /// <para>v</para>
    /// <para>vAngle</para>
    /// <para>bool isAimToPlayer</para>
    /// <para>acce</para>
    /// <para>accAngle</para>
    /// <para>maxV</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int EnemyBulletSetStraightParas(ILuaState luaState)
    {
        EnemyBulletBase bullet        = luaState.ToUserData(-6) as EnemyBulletBase;
        float           v             = (float)luaState.ToNumber(-5);
        float           angle         = (float)luaState.ToNumber(-4);
        bool            isAimToPlayer = luaState.ToBoolean(-3);
        float           acce          = (float)luaState.ToNumber(-2);
        float           accAngle;

        if (luaState.Type(-1) == LuaType.LUA_TBOOLEAN)
        {
            accAngle = angle;
        }
        else
        {
            accAngle = (float)luaState.ToNumber(-1);
        }
        if (isAimToPlayer)
        {
            Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition();
            float   relAngle  = MathUtil.GetAngleBetweenXAxis(playerPos - bullet.GetPosition());
            angle    += relAngle;
            accAngle += relAngle;
        }
        bullet.SetStraightParas(v, angle, acce, accAngle);
        return(0);
    }
Ejemplo n.º 4
0
    /// <summary>
    /// 碰撞检测
    /// </summary>
    /// <param name="collParas"></param>
    /// <returns></returns>
    private bool DetectCollisionWithEnemyBullet(EnemyBulletBase bullet)
    {
        if (bullet.Type == BulletType.Enemy_Laser)
        {
            return(false);
        }
        CollisionDetectParas collParas;

        switch (bullet.Type)
        {
        case BulletType.Enemy_Simple:
            collParas = bullet.GetCollisionDetectParas(0);
            break;

        case BulletType.Enemy_LinearLaser:
        case BulletType.Enemy_CurveLaser:
            collParas = bullet.GetCollisionDetectParas(-1);
            break;

        default:
            collParas = new CollisionDetectParas();
            break;
        }
        if (DetectCollisionWithCollisionParas(collParas))
        {
            CollidedByObject(bullet);
            return(true);
        }
        return(false);
    }
Ejemplo n.º 5
0
    /// <summary>
    /// 获取子弹当前位置
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int GetBulletPos(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-1) as EnemyBulletBase;

        luaState.PushNumber(bullet.posX);
        luaState.PushNumber(bullet.posY);
        return(2);
    }
Ejemplo n.º 6
0
    public static int EliminateBullet(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-1) as EnemyBulletBase;

        luaState.Pop(1);
        bullet.Eliminate();
        return(0);
    }
Ejemplo n.º 7
0
    /// <summary>
    /// 设置子弹的消除抗性
    /// <para>bullet</para>
    /// <para>flag 不能被消除的标识</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletResistEliminatedFlag(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase;
        int             flag   = luaState.ToInteger(-1);

        luaState.Pop(2);
        bullet.SetResistEliminateFlag(flag);
        return(0);
    }
Ejemplo n.º 8
0
    /// <summary>
    /// 设置子弹的透明度
    /// <para>bullet</para>
    /// <para>float alpha 透明度</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletAlpha(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase;
        float           alpha  = (float)luaState.ToNumber(-1);

        luaState.Pop(2);
        bullet.SetAlpha(alpha);
        return(0);
    }
Ejemplo n.º 9
0
 public override void Init(EnemyBulletBase bullet)
 {
     _bullet = bullet;
     if (_taskList == null)
     {
         _taskList = new List <Task>();
     }
     _taskCount = 0;
 }
Ejemplo n.º 10
0
    /// <summary>
    /// 设置子弹是否进行碰撞检测
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletDetectCollision(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase;
        bool            value  = luaState.ToBoolean(-1);

        luaState.Pop(2);
        bullet.SetDetectCollision(value);
        return(0);
    }
Ejemplo n.º 11
0
    /// <summary>
    /// 设置子弹的属性
    /// <para>bullet</para>
    /// <para>BulletParaType paraType</para>
    /// <para>float value</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletPara(ILuaState luaState)
    {
        EnemyBulletBase bullet   = luaState.ToUserData(-3) as EnemyBulletBase;
        BulletParaType  paraType = (BulletParaType)luaState.ToInteger(-2);
        float           value    = (float)luaState.ToNumber(-1);

        luaState.Pop(3);
        bullet.SetBulletPara(paraType, value);
        return(0);
    }
Ejemplo n.º 12
0
    /// <summary>
    /// 设置子弹位置
    /// <para>bullet</para>
    /// <para>posX</para>
    /// <para>posY</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletPos(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-3) as EnemyBulletBase;
        float           posX   = (float)luaState.ToNumber(-2);
        float           posY   = (float)luaState.ToNumber(-1);

        luaState.Pop(3);
        bullet.SetPosition(posX, posY);
        return(0);
    }
Ejemplo n.º 13
0
    /// <summary>
    /// 添加子弹的自定义碰撞事件
    /// <para>bullet</para>
    /// <para>triggerType 触发碰撞事件的类型,从eEliminateDef.CustomizedType0~eEliminateDef.CustomizedType5</para>
    /// <para>triggerFuncRef 触发的函数</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int AddBulletColliderTriggerEvent(ILuaState luaState)
    {
        EnemyBulletBase   bullet         = luaState.ToUserData(-3) as EnemyBulletBase;
        int               triggerType    = luaState.ToInteger(-2);
        int               triggerFuncRef = luaState.L_Ref(LuaDef.LUA_REGISTRYINDEX);
        BCColliderTrigger bc             = bullet.AddOrGetComponent <BCColliderTrigger>();

        bc.Register(triggerType, triggerFuncRef);
        return(0);
    }
Ejemplo n.º 14
0
 public bool RegisterEnemyBullet(EnemyBulletBase bullet)
 {
     if (bullet == null)
     {
         return(false);
     }
     _enemyBullets.Add(bullet);
     _enemyBulletsCount++;
     _countOfEnemyBulletCreatedInFrame++;
     return(true);
 }
Ejemplo n.º 15
0
    public override void Init(EnemyBulletBase bullet)
    {
        _bullet       = bullet as EnemyBulletMovable;
        _reboundCount = 0;
        _reboundPara  = 0;

        _left   = Global.GameLBBorderPos.x;
        _right  = Global.GameRTBorderPos.x;
        _bottom = Global.GameLBBorderPos.y;
        _top    = Global.GameRTBorderPos.y;
    }
Ejemplo n.º 16
0
    /// <summary>
    /// 物体做极坐标运动
    /// <para>bullet 敌机子弹</para>
    /// <para>float radius 起始半径</para>
    /// <para>float angle 起始角度</para>
    /// <para>float deltaR 半径增量</para>
    /// <para>float omega 角速度</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int EnemyBulletSetCurvedParas(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase;
        float           radius = (float)luaState.ToNumber(-4);
        float           angle  = (float)luaState.ToNumber(-3);
        float           deltaR = (float)luaState.ToNumber(-2);
        float           omega  = (float)luaState.ToNumber(-1);

        luaState.Pop(5);
        bullet.SetPolarParas(radius, angle, deltaR, omega);
        return(0);
    }
Ejemplo n.º 17
0
    /// <summary>
    /// 设置子弹的颜色与透明度
    /// <para>bullet</para>
    /// <para>float rValue 0~255</para>
    /// <para>float gValue 0~255</para>
    /// <para>float bValue 0~255</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletColorWithAlpha(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase;
        float           rValue = (float)luaState.ToNumber(-4);
        float           gValue = (float)luaState.ToNumber(-3);
        float           bValue = (float)luaState.ToNumber(-2);
        float           alpha  = (float)luaState.ToNumber(-1);

        luaState.Pop(5);
        bullet.SetColor(rValue, gValue, bValue, alpha);
        return(0);
    }
Ejemplo n.º 18
0
    /// <summary>
    /// 添加反弹
    /// <para>bullet</para>
    /// <para>reboundPara 反弹参数</para>
    /// <para>reboundCount 反弹次数</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int AddBulletRebound(ILuaState luaState)
    {
        EnemyBulletBase bullet       = luaState.ToUserData(-3) as EnemyBulletBase;
        int             reboundPara  = luaState.ToInteger(-2);
        int             reboundCount = luaState.ToInteger(-1);
        BCRebound       rebound      = bullet.AddOrGetComponent <BCRebound>();

        if (rebound != null)
        {
            rebound.AddReboundPara(reboundPara, reboundCount);
        }
        return(0);
    }
Ejemplo n.º 19
0
 public override void Clear()
 {
     _bullet = null;
     for (int i = 0; i < _triggerDataCount; i++)
     {
         int funcRef = _triggerDatas[i].triggerFuncRef;
         if (funcRef != 0)
         {
             InterpreterManager.GetInstance().UnrefLuaFunction(funcRef);
         }
     }
     _triggerDatas.Clear();
     _triggerDataCount = 0;
 }
Ejemplo n.º 20
0
    /// <summary>
    /// 做直线运动
    /// <para>bullet 敌机子弹</para>
    /// <para>float v 速度</para>
    /// <para>float angle 速度方向</para>
    /// <para>bool isAimToPlayer 是否朝向玩家</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int EnemyBulletDoStraightMove(ILuaState luaState)
    {
        EnemyBulletBase bullet        = luaState.ToUserData(-4) as EnemyBulletBase;
        float           v             = (float)luaState.ToNumber(-3);
        float           angle         = (float)luaState.ToNumber(-2);
        bool            isAimToPlayer = luaState.ToBoolean(-1);

        luaState.Pop(4);
        if (isAimToPlayer)
        {
            Vector2 playerPos = PlayerInterface.GetInstance().GetCharacter().GetPosition();
            angle += MathUtil.GetAngleBetweenXAxis(playerPos - bullet.GetPosition());
        }
        bullet.DoStraightMove(v, angle);
        return(0);
    }
Ejemplo n.º 21
0
    public static int AddBulletTask(ILuaState luaState)
    {
        EnemyBulletBase bullet  = luaState.ToUserData(-2) as EnemyBulletBase;
        int             funcRef = InterpreterManager.GetInstance().RefLuaFunction(luaState);

        luaState.Pop(1);
        Task task = ObjectsPool.GetInstance().GetPoolClassAtPool <Task>();

        task.funcRef  = funcRef;
        task.isFinish = false;
        task.luaState = null;
        BCCustomizedTask bc = bullet.GetComponent <BCCustomizedTask>();

        bc.AddTask(task);
        return(0);
    }
Ejemplo n.º 22
0
    /// <summary>
    /// 获取子弹的属性
    /// <para>bullet</para>
    /// <para>BulletParaType paraType</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int GetBulletPara(ILuaState luaState)
    {
        EnemyBulletBase bullet   = luaState.ToUserData(-2) as EnemyBulletBase;
        BulletParaType  paraType = (BulletParaType)luaState.ToInteger(-1);

        luaState.Pop(2);
        float value;

        if (bullet.GetBulletPara(paraType, out value))
        {
            luaState.PushNumber(value);
            return(1);
        }
        Logger.LogWarn("BulletPara " + paraType + " in " + bullet.Type + " is not exist!");
        return(0);
    }
Ejemplo n.º 23
0
    /// <summary>
    /// 根据id设置bullet的形状
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletStyleById(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase;
        string          id;

        if (luaState.Type(-1) == LuaType.LUA_TNUMBER)
        {
            id = luaState.ToNumber(-1).ToString();
        }
        else
        {
            id = luaState.ToString(-1);
        }
        bullet.SetStyleById(id);
        return(0);
    }
Ejemplo n.º 24
0
    /// <summary>
    /// 获取子弹的碰撞参数
    /// <para>bullet</para>
    /// <para>collisionIndex 第n个碰撞体</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int GetBulletCollisionDetectParas(ILuaState luaState)
    {
        EnemyBulletBase bullet = luaState.ToUserData(-2) as EnemyBulletBase;
        int             index  = luaState.ToInteger(-1);

        luaState.Pop(2);
        CollisionDetectParas collParas = bullet.GetCollisionDetectParas(index);

        luaState.PushInteger((int)collParas.type);
        luaState.PushNumber(collParas.centerPos.x);
        luaState.PushNumber(collParas.centerPos.y);
        luaState.PushNumber(collParas.radius);
        luaState.PushNumber(collParas.halfWidth);
        luaState.PushNumber(collParas.halfHeight);
        luaState.PushNumber(collParas.angle);
        return(7);
    }
Ejemplo n.º 25
0
    /// <summary>
    /// 碰撞检测
    /// </summary>
    /// <param name="collParas"></param>
    /// <returns></returns>
    private bool DetectCollisionWithEnemyBullet(EnemyBulletBase bullet)
    {
        int  nextColliderIndex = 0;
        int  curColliderIndex;
        bool isCollided = false;

        do
        {
            CollisionDetectParas collParas = bullet.GetCollisionDetectParas(nextColliderIndex);
            curColliderIndex  = nextColliderIndex;
            nextColliderIndex = collParas.nextIndex;
            if (DetectCollisionWithCollisionParas(collParas))
            {
                bullet.CollidedByObject(curColliderIndex, _eliminateType);
                isCollided = true;
            }
        } while (nextColliderIndex != -1);
        return(isCollided);
    }
Ejemplo n.º 26
0
    /// <summary>
    /// 添加子弹组件
    /// <para>type enum BulletComponentType</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int AddBulletComponent(ILuaState luaState)
    {
        EnemyBulletBase     bullet = luaState.ToUserData(-2) as EnemyBulletBase;
        BulletComponentType type   = (BulletComponentType)luaState.ToInteger(-1);

        luaState.Pop(2);
        if (type == BulletComponentType.ParasChange)
        {
            bullet.AddOrGetComponent <BCParasChange>();
        }
        else if (type == BulletComponentType.Rebound)
        {
            bullet.AddOrGetComponent <BCRebound>();
        }
        else if (type == BulletComponentType.ColliderTrigger)
        {
            bullet.AddOrGetComponent <BCColliderTrigger>();
        }
        return(0);
    }
Ejemplo n.º 27
0
    public override void Clear()
    {
        Task task;

        for (int i = 0; i < _taskCount; i++)
        {
            task = _taskList[i];
            if (task != null)
            {
                if (task.luaState != null)
                {
                    InterpreterManager.GetInstance().StopTaskThread(task.luaState, task.funcRef);
                }
                ObjectsPool.GetInstance().RestorePoolClassToPool <Task>(task);
            }
        }
        _taskList.Clear();
        _taskCount = 0;
        _bullet    = null;
    }
Ejemplo n.º 28
0
    /// <summary>
    /// SetData
    /// </summary>
    /// <param name="i_distance">二次元座標</param>
    /// <param name="stop">停止フラグ</param>
    public void SetData(EnemyBulletBase.EnemyBulletGroup info)
    {
        base.Start();
        myData = info;

        SPEED = info.Speed;
        DAMAGE = info.Damage;

        if (info.Homing) {
            distance = (parent.player.transform.position - this.transform.position).normalized;
        }
        else {
            float randRad = 1f;
            if (EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].RandRadius > 0) {
                randRad = Random.Range(-EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].RandRadius, EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].RandRadius);
            }
            distance = EnemyBulletBase.EnemyBulletRadData[info.BulletRadDataId].Radius * randRad;
        }
        isStop = myData.StopTime <= 0f;
    }
Ejemplo n.º 29
0
    private void NormalMover()
    {
        float distance = PlayerManager.Instance.PlayerInstance.transform.position.x - transform.position.x;

        if (distance > 0f)
        {
            gameObject.transform.localScale = new Vector3(-Mathf.Abs(gameObject.transform.localScale.x), gameObject.transform.localScale.y, gameObject.transform.localScale.z);
        }
        else if (distance < 0f)
        {
            gameObject.transform.localScale = new Vector3(Mathf.Abs(gameObject.transform.localScale.x), gameObject.transform.localScale.y, gameObject.transform.localScale.z);
        }

        homingAttackNowTime += Time.deltaTime;
        if (shortAttackInstance == null)
        {
            sr.sprite           = Base_Sprite;
            shortAttackNowTime += Time.deltaTime;
        }
        NormalMove(distance, moveSpeed);
        //遠距離攻撃
        if (normalShotTiming < homingAttackNowTime)
        {
            foreach (var _shot in normalShot)
            {
                var shotInstance = Instantiate(_shot.bulletBase, transform.position + new Vector3(_shot.position.x, _shot.position.y, 0), Quaternion.identity);
            }
            homingAttackNowTime = 0;
        }
        //近接攻撃
        if (shortAttackTime < shortAttackNowTime)
        {
            sr.sprite           = Attack_Sprite;
            shortAttackInstance = Instantiate(shortAttack.bulletBase, Vector3.zero, Quaternion.identity);
            shortAttackInstance.transform.parent        = transform;
            shortAttackInstance.transform.localPosition = new Vector3(shortAttack.position.x, shortAttack.position.y, 0);
            shortAttackNowTime = 0;
        }
    }
Ejemplo n.º 30
0
 private void Normal(float distance)
 {
     //初期化
     if (time == 0)
     {
         homingAttackNowTime = 0;
         shortAttackNowTime  = 0;
     }
     time += Time.deltaTime;
     homingAttackNowTime += Time.deltaTime;
     if (shortAttackInstance == null)
     {
         sr.sprite           = Base_Sprite;
         shortAttackNowTime += Time.deltaTime;
     }
     if (time > normalTime)
     {
         eState = FinalBossState.Move;
         time   = 0;
     }
     NormalMove(distance, moveSpeed);
     if (normalShotTiming < homingAttackNowTime)
     {
         foreach (var _shot in normalShot)
         {
             var shotInstance = Instantiate(_shot.bulletBase, transform.position + new Vector3(_shot.position.x, _shot.position.y, 0), Quaternion.identity);
         }
         homingAttackNowTime = 0;
     }
     if (shortAttackTime < shortAttackNowTime)
     {
         sr.sprite           = Attack_Sprite;
         shortAttackInstance = Instantiate(shortAttack.bulletBase, Vector3.zero, Quaternion.identity);
         shortAttackInstance.transform.parent        = transform;
         shortAttackInstance.transform.localPosition = new Vector3(shortAttack.position.x, shortAttack.position.y, 0);
         shortAttackNowTime = 0;
     }
 }
Ejemplo n.º 31
0
    /// <summary>
    /// 设置子弹的颜色
    /// <para>bullet</para>
    /// <para>float rValue 0~255</para>
    /// <para>float gValue 0~255</para>
    /// <para>float bValue 0~255</para>
    /// </summary>
    /// <param name="luaState"></param>
    /// <returns></returns>
    public static int SetBulletColor(ILuaState luaState)
    {
        int top = luaState.GetTop();

        if (top == 4)
        {
            EnemyBulletBase bullet = luaState.ToUserData(-4) as EnemyBulletBase;
            float           rValue = (float)luaState.ToNumber(-3);
            float           gValue = (float)luaState.ToNumber(-2);
            float           bValue = (float)luaState.ToNumber(-1);
            bullet.SetColor(rValue, gValue, bValue);
        }
        else
        {
            EnemyBulletBase bullet = luaState.ToUserData(-5) as EnemyBulletBase;
            float           rValue = (float)luaState.ToNumber(-4);
            float           gValue = (float)luaState.ToNumber(-3);
            float           bValue = (float)luaState.ToNumber(-2);
            float           alpha  = (float)luaState.ToNumber(-1);
            bullet.SetColor(rValue, gValue, bValue, alpha);
        }
        return(0);
    }