Beispiel #1
0
    public override bool update(BulkedBulletUnit3 bullet)
    {
        bullet.time += GM.t.delta;


        var prepos = bullet.position;


        var speed = bulletSpeed * effectFactor(bullet.barrelFactor, speedRate);

        var dir = bullet.rotation * Vector3.forward;

        var d = speed * GM.t.delta;


        bullet.position += dir * d;



        var ray = new Ray(prepos, dir);

        RaycastHit hit;

        var res = Physics.Raycast(ray, out hit, d, UserLayer.bulletHittable);

        if (res)
        {
            var hitter = getHitter(hit.collider);

            if (hitter)
            {
                if (hitter.isThroughOwnHit(bullet.owner, speed * bullet.time))
                {
                    var landing = hitter.landings ? hitter.landings.fragmentation : GM.defaultLandings.fragmentation;
                    //var landing = hitter.landings.fragmentation;

                    landing.emit(hit.point, hit.normal, 0.0f);


                    var ds = new DamageSourceUnit(damage, 0.8f, fragmentationRate, 0.0f, 0.0f);

                    hitter.shot(ref ds, dir * damage, ref hit, bullet.owner);
                }
            }
            else
            {
                //if( hit.rigidbody ) hit.rigidbody.AddForce( dir * damage, ForceMode.Impulse );
            }

            return(true);
        }


        return(bullet.time * speed >= bulletRange *effectFactor(bullet.barrelFactor, rangeRate));
    }
Beispiel #2
0
    public override bool update(BulkedBulletUnit3 bullet)
    {
        bullet.time += GM.t.delta;


        var prepos = bullet.position;


        var adtt = (bullet.time * bullet.time) / (lifeTime * lifeTime);
        // 終盤に加速して増える感じのレート

        var dtt = 1.0f - adtt;

        // 終盤に加速して減る感じのレート


        bullet.size = maxSize - (maxSize - minSize) * dtt;


        var speed = (dtt * bullet.barrelFactor) * (1.0f - linearWeight) + (bullet.time * bullet.barrelFactor) * linearWeight;

        var dir = bullet.rotation * Vector3.forward;

        var d = speed * GM.t.delta;


        var upAngle = bullet.upAngle;        // Random.Range( 0.0f, 360.0f );

        //var up = bullet.rotation * Quaternion.AngleAxis( upAngle, Vector3.forward ) * Vector3.up;
        var up = bullet.rotation * bullet.rotFaceDirection * Vector3.up;

        var diflect = up * (wide * adtt * GM.t.delta);


        var move = dir * d + diflect;

        bullet.position += move;



        var res = new RaycastHit();

        var isBgHit = Physics.Linecast(prepos, bullet.position, out res, UserLayer.fireHittableBg);

        if (isBgHit)
        {
            var w = move - Vector3.Dot(move, res.normal) * res.normal;

            bullet.position = prepos + w;

            bullet.rotation = Quaternion.LookRotation(w);
        }
        else
        {
            var cs = Physics.OverlapSphere(bullet.position, bullet.size * 0.5f, UserLayer.fireHittableCh);

            foreach (var c in cs)
            {
                var hitter = getHitter(c);

                if (hitter)
                {
                    if (hitter.isThroughOwnHit(bullet.owner, bullet.barrelFactor * bullet.time))
                    {
                        var damage = maxDamage * minDamageRate + maxDamage * dtt * (1.0f - minDamageRate);

                        var ds = new DamageSourceUnit(damage * GM.t.delta, 0.0f, 2.0f, moveStoppingDamage * GM.t.delta, 0.0f);

                        var force = dir * (moveStoppingDamage * 1000.0f * dtt * GM.t.delta);

                        hitter.fired(ref ds, force, bullet.position, c, bullet.owner);
                    }
                }
                else
                {
                    //if( hit.rigidbody ) hit.rigidbody.AddForce( dir * damage, ForceMode.Impulse );
                }
            }
        }


        return(bullet.time > lifeTime);
    }
Beispiel #3
0
 public abstract bool update(BulkedBulletUnit3 bullet);
Beispiel #4
0
    public override bool update(BulkedBulletUnit3 bullet)
    {
        bullet.time += GM.t.delta;

        bullet.size = bulletSize + bullet.time * 3.0f;


        //var prepos = bullet.position;

        var dir = bullet.rotation * Vector3.forward;

        var speed = (bulletSpeed * effectFactor(bullet.barrelFactor, speedRate)) - bullet.size * bullet.time;            // * 0.5f;

        var d = speed * GM.t.delta;


        var force = dir * d + Physics.gravity * (GM.t.delta * bullet.time);

        bullet.position += force;


        if (Physics.CheckSphere(bullet.position, bullet.size * 0.5f * 0.3f, UserLayer.acidHittableBg))
        {
            // 背景に触ったらとにかく消える

            var landing = GM.defaultLandings.erode;

            landing.emit(bullet.position, Quaternion.identity);

            return(true);
        }
        else
        {
            // もし毎フレームやる負荷が高かったら、接触してから一定時間は接触処理スキップ、としてみるといい
            var cols = Physics.OverlapSphere(bullet.position, bullet.size * 0.5f * 0.8f, UserLayer.acidHittableCh);

            foreach (var c in cols)
            {
                var hitter = getHitter(c);

                if (hitter)
                {
                    if (hitter.isThroughOwnHit(bullet.owner, speed * bullet.time))
                    {
                        var hitpos = bullet.position + (c.transform.position - bullet.position) * 0.8f;


                        if (Time.time > bullet.barrelFactor + 0.75f)
                        {
                            var landing = hitter.landings.erode;

                            landing.emit(hitpos, Quaternion.identity);

                            bullet.barrelFactor = Time.time;
                        }

                        var ds = new DamageSourceUnit(damage * GM.t.delta, 0.5f, 1.0f, moveStoppingDamage * GM.t.delta, moveStoppingRate);

                        hitter.eroded(ref ds, force, hitpos, c, bullet.owner);
                    }
                }
                else
                {
                    //if( hit.rigidbody ) hit.rigidbody.AddForce( dir * bulletSpeed, ForceMode.Impulse );
                }
            }
        }


        return(speed <= 0.0f | bullet.time >= lifeTime);
    }