Ejemplo n.º 1
0
    IEnumerator Land(GameObject tank)
    {
        var        tc      = tank.GetComponent <TankControl>();
        var        rigid   = tank.GetComponent <Rigidbody>();
        var        cannon  = tc.cannon.GetComponent <Rigidbody>();
        var        turrent = tc.turrent.GetComponent <Rigidbody>();
        var        vel     = rigid.velocity;
        Ray        ray     = new Ray(tank.transform.position, vel);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, 50, 1 << 10))
        {
            var height = Mathf.Max(hit.distance - 2, 1);
            var acc    = vel.sqrMagnitude / (2 * height);
            var time   = vel.magnitude / acc;
            for (float t = 0; t < time; t += Time.fixedDeltaTime)
            {
                var velDir = rigid.velocity.normalized;
                var a      = -acc * velDir - RelativeSystemControl.DownAt(tank.transform.position) * CenterGravity.g;
                rigid.angularVelocity = Vector3.zero;
                rigid.AddForce(a, ForceMode.Acceleration);
                turrent.AddForce(a, ForceMode.Acceleration);
                cannon.AddForce(a, ForceMode.Acceleration);
                yield return(new WaitForFixedUpdate());
            }
        }
    }
Ejemplo n.º 2
0
    void Update()
    {
        nightFactor = Vector3.Angle(sun.forward, RelativeSystemControl.DownAt(transform.position)) / 180f;
        float distance    = Mathf.Max((transform.position - RelativeSystemControl.system.position).magnitude, earthRadius + 1);
        float biasAngle   = Mathf.Acos(earthRadius / distance);
        float skyTopAlpha = Mathf.Lerp(0, 1, Mathf.Clamp01(Mathf.InverseLerp(100 + earthRadius, earthRadius, distance)));
        float thickness   = earthRadius / distance;

        atmoMat.SetVector("_SkyDistance", new Vector4(SkyGradientASL.x * skyTopAlpha, SkyGradientASL.y, SkyGradientASL.z - biasAngle, SkyGradientASL.z - biasAngle + (SkyGradientASL.w - SkyGradientASL.z) * thickness));
        atmoMat.SetColor("_SkyColor", SkyColor.Evaluate(nightFactor));
        atmoMat.SetVector("_FogDistance", new Vector4(FogDistanceASL.x, FogDistanceASL.y, FogDistanceASL.z - biasAngle, FogDistanceASL.w - biasAngle));
        atmoMat.SetColor("_FogColor", FogColor.Evaluate(nightFactor));
    }
Ejemplo n.º 3
0
 static void SnapToGround(float height)
 {
     Transform[] transforms = Selection.transforms;
     foreach (var t in transforms)
     {
         Ray        ray = new Ray(t.position, RelativeSystemControl.DownAt(t.position));
         RaycastHit hit;
         if (Physics.Raycast(ray, out hit, 1 << 10))
         {
             t.position = hit.point - RelativeSystemControl.DownAt(t.position) * height;
         }
     }
 }
Ejemplo n.º 4
0
    public Vector3 CalculateAim(Vector3 target)
    {
        var   down          = RelativeSystemControl.DownAt(transform.position);
        var   planearTarget = Vector3.ProjectOnPlane(target - transform.position, down);
        float distance      = planearTarget.magnitude;
        var   shellControl  = shell.GetComponent <ShellControl>();
        float speed         = shellControl.speed;
        float g             = CenterGravity.g * shell.GetComponent <CenterGravity>().multiplier;
        float t             = distance / speed;
        float h             = g * t * t / 2;

        Debug.Log(t);
        return(target - down * h);
    }
Ejemplo n.º 5
0
    IEnumerator Drop(GameObject tank, Vector3 start, Vector3 end, float totalTime)
    {
        var sc       = Instantiate(skyCrane).GetComponent <SkyCraneControl>();
        var scfollow = sc.gameObject.AddComponent <Follow>();

        scfollow.target      = tank.transform;
        scfollow.lateUpdate  = true;
        scfollow.fixedUpdate = true;
        scfollow.translation = true;
        scfollow.rotation    = true;
        sc.setTeam(team);
        sc.StartParticleIdle();
        var rigid = tank.GetComponent <Rigidbody>();
        var tc    = tank.GetComponent <TankControl>();

        tc.controllable   = false;
        rigid.isKinematic = true;
        var lastPos = start;
        var vel     = Vector3.zero;

        for (float t = 0; t < 1; t += Time.fixedDeltaTime / totalTime)
        {
            //Debug.Log(t);
            var currentPos = SamplePath01(start, end, t);
            vel = (currentPos - lastPos) / Time.fixedDeltaTime;
            var worldDown          = RelativeSystemControl.DownAt(tank.transform.position);
            var lookAtAxis         = Vector3.Cross(vel.normalized, worldDown);
            var whereIShouldLookAt = Quaternion.Lerp(Quaternion.LookRotation(vel.normalized, lookAtAxis), Quaternion.LookRotation(worldDown, lookAtAxis), t * t * t / 1.5f) * Vector3.forward;
            tank.transform.LookAt(whereIShouldLookAt, -worldDown, Vector3.down, Vector3.back);
            rigid.velocity          = vel;
            rigid.angularVelocity   = Vector3.zero;
            tank.transform.position = currentPos;
            lastPos = currentPos;
            yield return(new WaitForFixedUpdate());
        }
        rigid.isKinematic = false;
        rigid.velocity    = vel;
        tc.cannon.GetComponent <Rigidbody>().velocity  = vel;
        tc.turrent.GetComponent <Rigidbody>().velocity = vel;
        sc.StartParticle();
        yield return(Land(tank));

        //sc.EndParticle();
        scfollow.enabled = false;
        sc.gameObject.AddComponent <Rigidbody>();
        sc.gameObject.AddComponent <ConstantForce>().force  = sc.transform.up * 40;
        sc.gameObject.AddComponent <SelfDestruction>().life = 8;
        tc.controllable = true;
    }
Ejemplo n.º 6
0
    void Update()
    {
        Vector3    dir           = (transform.up - RelativeSystemControl.DownAt(transform.position)).normalized;
        Vector3    originalWorld = (transform.parent.localToWorldMatrix * localPos.V4(1)).V3();
        Ray        ray           = new Ray(originalWorld + dir * (detectDistance), -dir);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, detectDistance + safeDistance, (1 << 10) + (1 << 4)))
        {
            targetLocalPos = (transform.parent.worldToLocalMatrix * (hit.point + dir * safeDistance).V4(1)).V3();
        }
        else
        {
            targetLocalPos = localPos;
        }
        transform.localPosition = Vector3.Lerp(transform.localPosition, targetLocalPos, Mathf.Clamp01(40f * Time.deltaTime));
    }
Ejemplo n.º 7
0
    public bool Predict(float stepT, int maxIterations, out TankControl tc, out Vector3 endPoint)
    {
        float speed      = shell.GetComponent <ShellControl>().speed;
        float gravity    = shell.GetComponent <CenterGravity>().multiplier *CenterGravity.g;
        var   startPoint = cannonMark.position;
        var   velocity   = cannonMark.forward * speed;

        for (int i = 0; i < maxIterations; i++)
        {
            Vector3 est        = startPoint + stepT * velocity;
            Vector3 averageG   = (RelativeSystemControl.DownAt(startPoint) + RelativeSystemControl.DownAt(est)).normalized * gravity;
            Vector3 estDescend = averageG * stepT * stepT / 2f;
            Vector3 estDv      = averageG * stepT;
            est += estDescend;
            Ray        ray = new Ray(startPoint, est - startPoint);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, (est - startPoint).magnitude, (1 << 10) + (1 << 13)))
            {
                Debug.DrawLine(startPoint, hit.point, Color.cyan);
                if (hit.collider.gameObject.layer == 10)
                {//terrain
                    tc       = null;
                    endPoint = hit.point;
                    return(false);
                }
                else if (hit.collider.gameObject.layer == 13)
                {//tank
                    tc       = FindTankControl(hit.collider.transform);
                    endPoint = hit.point;
                    return(true);
                }
            }
            else
            {
                Debug.DrawLine(startPoint, est);
                startPoint = est;
                velocity  += estDv;
            }
        }
        tc       = null;
        endPoint = startPoint;
        return(false);
    }
Ejemplo n.º 8
0
    void SetDestroyed()
    {
        foreach (var matReplacement in matReplacements)
        {
            matReplacement.mr.sharedMaterial = matReplacement.newMat;
        }
        var upRotation = Quaternion.LookRotation(-RelativeSystemControl.DownAt(transform.position));

        //pm.Emit("FragDestroyed", transform.position, upRotation);
        pm.Emit("DustDestroyed", transform.position, upRotation);
        pm.Emit("SparkDestroyed", transform.position, upRotation);
        pm.Emit("LightDestroyed", transform.position, upRotation);
        tm.DelayFunc(() => pm.Emit("SparkDestroyed", transform.position, upRotation), 0.4f);
        tm.DelayFunc(() => pm.Emit("DustDestroyed", transform.position, upRotation), 0.4f);
        tm.DelayFunc(() => pm.Emit("LightDestroyed", transform.position, upRotation), 0.4f);
        tc.controllable = false;
        tc.isDestroyed  = true;
        tc.Explode();
    }
Ejemplo n.º 9
0
    void Update()
    {
        Vector3 camDown  = RelativeSystemControl.DownAt(Camera.main.transform.position);
        Vector3 thisDown = -transform.up;
        float   angle    = Vector3.Angle(camDown, thisDown);

        if (angle > maxDisplayAngle)
        {
            mr.enabled = false;
        }
        else
        {
            mr.enabled = true;
            var t      = Mathf.InverseLerp(minDisplayAngle, maxDisplayAngle, angle);
            var size   = Mathf.Lerp(minSize, maxSize, t);
            var a      = Mathf.Lerp(minA, maxA, Mathf.Clamp01(t));
            var height = Mathf.Lerp(minHeight, maxHeight, t);
            transform.localPosition = new Vector3(0, height, 0);
            transform.localScale    = Vector3.one * size;
            mr.material.SetColor("_TintColor", new Color(mainColor.r, mainColor.g, mainColor.b, a));
        }
    }
Ejemplo n.º 10
0
 public Vector3 GetVelocityDir(Vector3 myPoint)
 {
     if (path != null)
     {
         Vector3 nearestDir  = Vector3.zero;
         float   nearestDist = 10000;
         var     waypoints   = path.vectorPath;
         for (int i = 0; i < waypoints.Count - 1; i++)
         {
             Vector3 down           = RelativeSystemControl.DownAt(waypoints[i + 1]);
             Vector3 myHeight       = Vector3.Project((waypoints[i + 1] - myPoint), down);
             Vector3 myPointOnPlane = myPoint + myHeight;
             float   distance       = (waypoints[i] - myPointOnPlane).magnitude;
             if (distance < nearestDist)
             {
                 Vector3 dir = (waypoints[i + 1] - myPointOnPlane).normalized;
                 nearestDir = dir;
             }
         }
         return(nearestDir);
     }
     return(Vector3.zero);
 }
Ejemplo n.º 11
0
    void Update()
    {
        if (hasAxis)
        {
            if (relativeToPlanet)
            {
                axis = -RelativeSystemControl.DownAt(transform.position);
            }
            else
            {
                axis = transform.up;
            }


            var look       = Quaternion.LookRotation(axis, Camera.main.transform.position - transform.position);
            var startlocal = Quaternion.Inverse(Quaternion.LookRotation(localFront, localUp));
            transform.rotation = look * startlocal;
        }
        else
        {
            transform.LookAt(Camera.main.transform);
        }
    }
Ejemplo n.º 12
0
    void Update()
    {
        var tankplayer = Singleton <TankInputPlayer> .instance;

        if (Input.GetKeyDown(KeyCode.M))
        {
            Singleton <CameraSwitch> .instance.mapMode ^= true;
            if (!tankplayer)
            {
                Singleton <CameraSwitch> .instance.mapMode = true;
            }
        }

        showCross = Singleton <CameraSwitch> .instance.mapMode && (!tankplayer || tankplayer.tc.isDestroyed);
        if (showCross)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray        ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, 2000, 1 << 10))
                {
                    if (tankplayer)
                    {
                        tankplayer.enabled = false;
                        Singleton <TankInputPlayer> .Clear();
                    }
                    var t = Instantiate(dropMe).transform;
                    t.position = hit.point - 20 * RelativeSystemControl.DownAt(hit.point);
                    //Singleton<TankInputPlayer>.Register(t.GetComponent<TankInputPlayer>());

                    Singleton <CameraSwitch> .instance.mapMode = false;
                }
            }
        }
    }
Ejemplo n.º 13
0
    void MoveTowardVel(Vector3 vel)
    {
        vel = Vector3.ProjectOnPlane(vel, tc.frontMark.up);
        Debug.DrawLine(transform.position, transform.position + vel, Color.magenta);
        float mag   = vel.magnitude;
        float angle = Vector3.SignedAngle(tc.frontMark.forward, vel, -RelativeSystemControl.DownAt(transform.position));

        if (mag > 1)
        {
            //if (rigid.velocity.magnitude < 5)
            //{
            //    //if (angle > 150 || angle < -150)
            //    //    Back();
            //    //else
            //    //if (angle > 90)
            //    //    BackRight();
            //    //else if(angle < -90)
            //    //    BackLeft();
            //    //else if (angle < -10)
            //    //    Left();
            //    //else if (angle > 10)
            //    //    Right();
            //    //else
            //    //{
            //    //    if (Vector3.Dot(rigid.velocity, vel.normalized) > mag)
            //    //        Stop();
            //    //    else
            //    //        Move();
            //    //}
            //}
            //else
            //{
            //    if (angle < -10)
            //        Left();
            //    else if (angle > 10)
            //        Right();
            //    else
            //    {
            //        if (Vector3.Dot(rigid.velocity, vel.normalized) > mag)
            //            Stop();
            //        else
            //            Move();
            //    }
            //}

            if (angle < -10)
            {
                FlexLeft(0);
            }
            else if (angle > 10)
            {
                FlexRight(0);
            }
            else
            {
                if (Vector3.Dot(rigid.velocity, vel.normalized) > mag)
                {
                    Stop();
                }
                else
                {
                    FlexMove(0);
                }
            }
        }
        else
        {
            Stop();
        }
    }