Exemplo n.º 1
0
    // ヒット関連処理 ------------------------


    /// <summary>
    /// キャラクターにヒットしていればダメージを与え、act を返す。
    /// オウンヒット判定はダメージが入るかどうかのみに関与し、戻り値はオウンヒットに関係なく act が返る。
    /// </summary>
    void damageTohitCh(

        StringParticlePool.StringUnit line, ref RaycastHit hit, _Action3 act, _Hit3 hitter,

        Vector3 forceSeed, float damageRate, bool isOwnHittable = true

        )
    {
        if (!isOwnHittable && act == line.owner)
        {
            return;                                                     // オウンヒットなら抜ける
        }
        if (line.owner && !line.owner.targetTeam.isMate(act.attachedTeam))
        {
            return;                                                                             // 攻撃対象以外なら抜ける
        }
        var landing = hitter.landings ? hitter.landings.erode : GM.defaultLandings.erode;       //暫定

        //var landing = hitter.landings.erode;//本式はこっち

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



        var force = forceSeed * (GM.t.deltaR * bulletSize * hitForceRateCh);


        var d = damage * damageRate;

        var ds = new DamageSourceUnit(d, 0.5f, 1.0f, moveStoppingDamage * damageRate, moveStoppingRate);


        hitter.shot(ref ds, force, ref hit, line.owner);
    }
Exemplo n.º 2
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));
    }
Exemplo n.º 3
0
    public override void emit(Vector3 pos, Quaternion rot, float rangeFactor, float sizeFactor, int numCount, _Action3 act, Transform tfMuzzle = null)
    {
        var sizedRadius = radius * sizeFactor;


        var eo = (Explosion)instantiateWithPoolingGameObject(pos, rot, true);          //Instantiate( gameObject, pos, rot ) as GameObject;

        eo.ps.startSize = sizedRadius * 0.8f;

        eo.ps.startSpeed = sizedRadius * 0.8f;

        eo.ps.Play();


        var colliders = Physics.OverlapSphere(pos, sizedRadius, UserLayer.explosionHittable, QueryTriggerInteraction.Collide);

        var cgroups = colliders.Select(col => new HitterAndColliderPair {
            h = getHitter(col), c = col
        }).GroupBy(x => x.h.getParentHitter(), x => x);

        foreach (var hittersByParent in cgroups)
        {
            //foreach( var c in colliders )
            foreach (var hit in hittersByParent)
            {
                var hitter = hit.h;                //getHitter( c );

                if (hitter != null)
                {
                    if (hitter.isThroughOwnHit(act, float.PositiveInfinity))
                    {
                        var ds = new DamageSourceUnit(damage, 0.6f, fragmentation, downDamage, 0.0f);

                        hitter.blasted(ref ds, impulsiveForce, boringFactor, pos, sizedRadius, hit.c, act);
                    }
                }
                else
                {
                    //var rb = c.attachedRigidbody;

                    ////rb.AddForceAtPosition( impulsiveForce * 20.0f * 0.75f * ( ( act.tfBody.position - pos ).normalized + Vector3.up * 0.25f ), pos, ForceMode.Impulse );
                    ////rb.AddForceAtPosition( impulsiveForce * 0.05f * ( ( rb.position - pos ).normalized + Vector3.up * 0.4f ), pos, ForceMode.Impulse );
                    //rb.AddForceAtPosition( impulsiveForce * ( ( rb.position - pos ).normalized * 0.6f + Vector3.up * 0.4f ), pos, ForceMode.Impulse );
                }
            }

            if (hittersByParent.Key != null)
            {
                var ds = new DamageSourceUnit(damage, 0.6f, fragmentation, downDamage, 0.0f);

                hittersByParent.Key.blasted(ref ds, impulsiveForce, boringFactor, pos, sizedRadius, null, act);
            }
        }
    }
Exemplo n.º 4
0
    protected override void onHit(_Hit3 hitter, ref RaycastHit hit, Vector3 dir)
    {
        var landing = hitter.landings ? hitter.landings.fragmentation : GM.defaultLandings.fragmentation;

        //var landing = hitter.landings.fragmentation;

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


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

        hitter.shot(ref ds, dir * damage, ref hit, owner);
    }
Exemplo n.º 5
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);
    }
Exemplo n.º 6
0
Arquivo: Acid3.cs Projeto: abarabone/a
    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);
    }