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()); } } }
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)); }
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; } } }
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); }
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; }
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)); }
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); }
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(); }
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)); } }
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); }
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); } }
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; } } } }
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(); } }