Пример #1
0
    void SimulateCollision(List <Unit> targets)
    {
        List <bool>          clean = new List <bool>();
        List <CollisionInfo> infos = new List <CollisionInfo>();

        //Simulate Collision:manipulate only veloity and position
        PhysicsSimulator.SimulateCollision(targets, mapBehaviour, this, clean, infos);

        for (int i = 0; i < targets.Count; i++)
        {
            if (clean[i])
            {
                PhysicsSimulator.ApplyIntegral(targets[i]);
            }
            else
            {
                PhysicsSimulator.SimulateIntegral(targets[i], Time.deltaTime, mapBehaviour);
                PhysicsSimulator.ApplyIntegral(targets[i]);
            }
        }
        for (int i = 0; i < infos.Count; i++)
        {
            CollisionInfo collision = infos[i];
            // Stop healing buff
            infos[i].me.buff    &= ~BuffFlag.BUFF_HEALING;
            infos[i].other.buff &= ~BuffFlag.BUFF_HEALING;
            UnitInfoTag unitInfoTag = FindInstance(collision.me.uuid);
            if (unitInfoTag != null)
            {
                unitInfoTag.CollisionEvent(collision);
            }
        }
        List <Unit> remains = new List <Unit>();

        for (int i = 0; i < targets.Count; i++)
        {
            Unit curUnit = targets[i];
            //死亡判定
            if (isClient == 0 && !curUnit.isDead)
            {
                if (curUnit.HP <= 0)
                {
                    curUnit.isDead = true;
                }
                else if (isOutOfBounds(curUnit))     //ユニットが範囲外に出たときの死亡判定
                {
                    curUnit.isDead = true;
                }
            }
            if (!curUnit.isDead)
            {
                remains.Add(curUnit);
            }
        }
        units = remains;
        checkGameSet();
    }
Пример #2
0
    public List <Vector3> GetTrails(Vector3 position, Vector3 velocity)
    {
        List <Vector3> trails = new List <Vector3>();
        float          dt     = 1 / 30f;
        Unit           unit   = new Unit();

        unit.x   = position.x;
        unit.z   = position.z;
        unit.x1  = position.x;
        unit.z1  = position.z;
        unit.vx  = velocity.x;
        unit.vz  = velocity.z;
        unit.vx1 = velocity.x;
        unit.vz1 = velocity.z;
        for (float t = 0; t < 10f; t += dt)
        {
            unit.vx1 = unit.vx;
            unit.vz1 = unit.vz;
            PhysicsSimulator.SimulateIntegral(unit, dt, MapBehaviour.instance);
            if (!PhysicsSimulator.CollideMap(unit, MapBehaviour.instance))
            {
//                Debug.Log("collided");
                unit.vx = unit.vx1;
                unit.vz = unit.vz1;
                PhysicsSimulator.SimulateIntegral(unit, dt, MapBehaviour.instance);
            }
            PhysicsSimulator.ApplyIntegral(unit);
            trails.Add(new Vector3(unit.x, 0, unit.z));
            if (t > 3)
            {
                dt = 0.1f;
            }
            if (unit.vx == 0 && unit.vz == 0)
            {
                break;
            }
        }
        return(trails);
    }