public static float GetErrorBetweenIncludingVertical(float angle1InDeg, float angle2InDeg) { var e1 = GetErrorBetween(angle1InDeg, angle2InDeg); var e2 = GetErrorBetween(MTool.NormalizeAngleBetween_n180top180(angle1InDeg + 180), angle2InDeg); return(Mathf.Min(e1, e2)); }
public void DrawLine(LineRenderer line, Vector3[] screenPositions, Color?color = null, float lifeTime = 5000) { for (int k = 0; k < screenPositions.Length; k++) { screenPositions[k] = MTool.ScreenToWorld(screenPositions[k]); } //绘制 line.positionCount = screenPositions.Length; line.SetPositions(screenPositions); line.enabled = true; if (color == null) { color = Color.red; } line.startColor = (Color)color; line.endColor = (Color)color; line.startWidth = 0.14f; //设置倒计时关闭 if (!TimerForLines.ContainsKey(line)) { SingleTimer timer = new SingleTimer(lifeTime, DisableLine, false, false, line); TimerForLines.Add(line, timer); } TimerForLines[line].Interval = lifeTime; TimerManager.Instance.StartTimer(TimerForLines[line]); }
// Update is called once per frame void Update() { if (HitInfo == null) { return; } if (!HasHitPlayer) { var curX = HitInfo.GetCurXByCurTime(); //显示合法 if (curX >= -0.1f && curX <= 1.1f) { //计算出y值 var curY = HitInfo.Track.GetYByX(curX); var curK = HitInfo.Track.GetGradientByX(curX); //var curQuaternion = MTool.GetQuaternionByGradient(curK); var curRotationAngle = MTool.GetRotationAngleByGradient(curK); CurrentPositionInWorld = MTool.NormalizedToWorld(new Vector2(curX, curY)); m_R2D.MovePosition(CurrentPositionInWorld); m_R2D.rotation = curRotationAngle * Mathf.Rad2Deg; } //不用显示 else if (curX > 1.1f) { Destroy(gameObject); } } }
// Update is called once per frame void Update() { //在打击点来临前5秒产生投掷物 var tb = GameManager.Instance.m_TableHits; for (int k = 0; k < tb.GetCount(); k++) { var hitInfo = tb.GetValue(k); if (HitIDGenerated.Contains(hitInfo.Id)) { continue; } var curX = hitInfo.GetCurXByCurTime(); if (curX >= XToBeGeneratedFrom) { var ammuInfo = GameManager.Instance.m_TableTouzhiwu.GetValue(hitInfo.Ammu_ID); var ammuClass = ammuInfo.Prefab_Ammu; var trackInfo = GameManager.Instance.m_TablePaowuxian.GetValue(hitInfo.Track_ID); var newAmmu = Instantiate(ammuClass, MTool.ScreenToWorld(new Vector2(curX, trackInfo.GetYByX(curX))), Quaternion.identity).GetComponent <Ammu>(); newAmmu.HitInfo = hitInfo; HitIDGenerated.Add(hitInfo.Id); } } }
void RTool() { Handles.color = color; // Move Handles ruler.to = Handles.PositionHandle(ruler.to, Quaternion.identity); ruler.from = Handles.PositionHandle(ruler.from, Quaternion.identity); // Snapping if (ruler.snap) { ruler.to = new Vector3(MTool.RoundTo(ruler.to.x, Mathf.RoundToInt(1 / ruler.snapValue)), MTool.RoundTo(ruler.to.y, Mathf.RoundToInt(1 / ruler.snapValue)), MTool.RoundTo(ruler.to.z, Mathf.RoundToInt(1 / ruler.snapValue))); ruler.from = new Vector3(MTool.RoundTo(ruler.from.x, Mathf.RoundToInt(1 / ruler.snapValue)), MTool.RoundTo(ruler.from.y, Mathf.RoundToInt(1 / ruler.snapValue)), MTool.RoundTo(ruler.from.z, Mathf.RoundToInt(1 / ruler.snapValue))); } // Draw Handles.DrawDottedLine(ruler.from, ruler.to, 10.0f); GUIStyle style = new GUIStyle(); style.normal.textColor = color; style.fontSize = 20; // Distance float d = Vector3.Distance(ruler.from, ruler.to); d = MTool.Round(d, decimals); char m = 'm'; Handles.Label((ruler.from + ruler.to) / 2, d.ToString() + m, style); }
public void OnSwipe(Gesture g) { CreateEffectByGestureIfNotExist(g); FingerEffects[g.fingerIndex].gameObject.transform.position = MTool.ScreenToWorld(g.position); var emission = FingerEffects[g.fingerIndex].emission; emission.rateOverDistance = 80; }
public void CreateEffectByGestureIfNotExist(Gesture g) { if (!FingerEffects.ContainsKey(g.fingerIndex)) { var ps = Instantiate(ParticleClass, MTool.ScreenToWorld(g.position), Quaternion.identity); FingerEffects.Add(g.fingerIndex, ps.GetComponent <ParticleSystem>()); } }
public float GetCurrentExpectedHitAngle() { if (m_Track != null) { var ans = MTool.GetRotationAngleByGradient(m_Track.GetGradientByX(GetCurXByCurTime())) * Mathf.Rad2Deg + 90.0f; return(MTool.NormalizeAngleBetween_n180top180(ans)); } return(0); }
public void ReconstructAllLines(Msg msg = null) { var table = GameManager.Instance.m_TablePaowuxian; for (int k = 0; k < table.GetCount(); k++) { var tr = table.GetValue(k); Vector3[] _v = tr.GetPointsByX(-0.2f, 1, GameManager.Instance.PrecisionOfDebugPaintTrack); _v = MTool.NormalizedToScreen(_v); Logger.Instance.DrawLine(LinesForTracks[k], _v); } }
public void RefreshABC() { //抛物线情况 if (IsParabola) { MTool.CalculateABCForParabola(ref a, ref b, ref c, YIntercept, Peak); } //直线情况 else { //如果是直线,a是0 MTool.CalculateBCForStraightLine(ref a, ref b, ref c, YIntercept, Peak); } }
public void Refresh() { transform.position = HitInfo.GetExpectedPosInWorld(); var offset = MTool.Deg2Vector2(HitInfo.ExpectedHitAngle); offset *= 1.0f;//长度 m_ExpectedAngleDrawer.SetPosition(0, gameObject.transform.position); m_ExpectedAngleDrawer.SetPosition(1, gameObject.transform.position + (Vector3)offset); offset = MTool.Deg2Vector2(HitInfo.ExpectedHitAngle - GameManager.Instance.m_TableHits.AllowedErrorAngle); offset *= 1.0f;//长度 m_LeftDrawer.SetPosition(0, gameObject.transform.position); m_LeftDrawer.SetPosition(1, gameObject.transform.position + (Vector3)offset); offset = MTool.Deg2Vector2(HitInfo.ExpectedHitAngle + GameManager.Instance.m_TableHits.AllowedErrorAngle); offset *= 1.0f;//长度 m_RightDrawer.SetPosition(0, gameObject.transform.position); m_RightDrawer.SetPosition(1, gameObject.transform.position + (Vector3)offset); m_IdShow.text = "P" + HitInfo.Id; }
void ATool() { Handles.color = color; // Move Handles angle.from = Handles.PositionHandle(angle.from, Quaternion.identity); angle.p1 = Handles.PositionHandle(angle.p1, Quaternion.identity); angle.p2 = Handles.PositionHandle(angle.p2, Quaternion.identity); // Draw Handles.DrawLine(angle.from, angle.p1); Handles.DrawLine(angle.from, angle.p2); Vector3 n, s1, s2; s1 = (angle.p2 - angle.from).normalized; s2 = (angle.p1 - angle.from).normalized; n = Vector3.Cross(s1, s2); float s1Length = Vector3.Distance(angle.from, angle.p1); float s2Length = Vector3.Distance(angle.from, angle.p2); float length = AngleTool.Smallest(s1Length, s2Length); GUIStyle style = new GUIStyle(); style.normal.textColor = color; style.fontSize = 20; float a = Vector3.Angle(s1, s2); a = MTool.Round(a, decimals); char m = '°'; Handles.DrawWireArc(angle.from, n, (angle.p2 - angle.from).normalized, a, length / 2); Handles.Label(angle.from, a.ToString() + m, style); }
public void OnSwipe(Gesture g) { if (m_C2D != null) { if (m_C2D.OverlapPoint(MTool.ScreenToWorld(g.position))) { //产生击打尝试 Debug.Log("hit"); var hitVectorDirection = g.swipeVector; var hitAngle = MTool.Vector2Deg(hitVectorDirection); var errorAngle = MTool.GetErrorBetweenIncludingVertical(hitAngle, HitInfo.GetCurrentExpectedHitAngle()); if (errorAngle <= m_AllowedErrorAngle) { Destroy(gameObject); EventManager.Send(new Msg(EMessageID.Msg_Hit, CurrentPositionInWorld, g.swipeVector, errorAngle)); } else { EventManager.Send(new Msg(EMessageID.Msg_Miss, CurrentPositionInWorld, g.swipeVector, errorAngle)); } } } }
void VTool(VOLUME_MODE MODE) { Handles.color = color; switch (MODE) { case VOLUME_MODE.Box: VolumeTool.DrawCube(volume.bounds.center, volume.bounds.size); Vector3 size = Handles.ScaleHandle(volume.bounds.size, volume.bounds.center, Quaternion.identity, HandleUtility.GetHandleSize(volume.bounds.center) * 1.25f); Vector3 center = Handles.PositionHandle(volume.bounds.center, Quaternion.identity); Vector3 textPos = center + new Vector3(0, -0.5f, 0); volume.bounds.size = size; volume.bounds.center = center; Vector3 minCorner = Handles.FreeMoveHandle(volume.bounds.min, Quaternion.identity, 0.075f, new Vector3(volume.snap, volume.snap, volume.snap), Handles.RectangleHandleCap); Vector3 maxCorner = Handles.FreeMoveHandle(volume.bounds.max, Quaternion.identity, 0.075f, new Vector3(volume.snap, volume.snap, volume.snap), Handles.RectangleHandleCap); volume.bounds.min = minCorner; volume.bounds.max = maxCorner; GUIStyle style = new GUIStyle(); style.normal.textColor = color; style.fontSize = 20; style.alignment = TextAnchor.MiddleCenter; float rectSize = size.x * size.y * size.z; rectSize = MTool.Round(rectSize, decimals); rectSize = Mathf.Abs(rectSize); string m = "m³"; Handles.Label(textPos, rectSize.ToString() + m + '\n' + size.ToString(), style); break; case VOLUME_MODE.Sphere: volume.position = Handles.PositionHandle(volume.position, Quaternion.identity); volume.sizer = Handles.FreeMoveHandle(volume.sizer, Quaternion.identity, 0.075f, Vector3.zero, Handles.RectangleHandleCap); Vector3 tPos = volume.position + new Vector3(0, -0.25f, 0); volume.radius = Vector3.Distance(volume.position, volume.sizer); Handles.DrawLine(volume.sizer, volume.position); Vector3 norm = (volume.position - volume.sizer).normalized; Quaternion rotFacing = Quaternion.identity; if (norm.magnitude > 0.001f) { rotFacing = Quaternion.LookRotation(norm); } Quaternion rotOpposite = rotFacing * Quaternion.Euler(0, 90.0f, 0); Handles.CircleHandleCap(0, volume.position, rotFacing, volume.radius, EventType.Repaint); Handles.CircleHandleCap(0, volume.position, rotOpposite, volume.radius, EventType.Repaint); float r = volume.radius * 4 * Mathf.PI; r = MTool.Round(r, decimals); m = "m²"; style = new GUIStyle(); style.normal.textColor = color; style.fontSize = 20; style.alignment = TextAnchor.MiddleCenter; Handles.Label(tPos, r.ToString() + m, style); break; case VOLUME_MODE.Plane: volume.p1 = Handles.FreeMoveHandle(volume.p1, Quaternion.identity, 0.075f, Vector3.zero, Handles.RectangleHandleCap); volume.p2 = Handles.FreeMoveHandle(volume.p2, Quaternion.identity, 0.075f, Vector3.zero, Handles.RectangleHandleCap); volume.p3 = Handles.FreeMoveHandle(volume.p3, Quaternion.identity, 0.075f, Vector3.zero, Handles.RectangleHandleCap); volume.p4 = Handles.FreeMoveHandle(volume.p4, Quaternion.identity, 0.075f, Vector3.zero, Handles.RectangleHandleCap); Handles.DrawLine(volume.p1, volume.p2); Handles.DrawLine(volume.p2, volume.p3); Handles.DrawLine(volume.p3, volume.p4); Handles.DrawLine(volume.p4, volume.p1); Handles.DrawDottedLine(volume.p1, volume.p3, 10f); float area1 = VolumeTool.FindArea(volume.p1, volume.p3, volume.p4); float area2 = VolumeTool.FindArea(volume.p1, volume.p2, volume.p3); float total = area1 + area2; total = MTool.Round(total, decimals); m = "m²"; style = new GUIStyle(); style.normal.textColor = color; style.fontSize = 20; style.alignment = TextAnchor.MiddleCenter; Vector3 t1 = (volume.p1 + volume.p3 + volume.p4) / 3; Vector3 t2 = (volume.p1 + volume.p2 + volume.p3) / 3; Handles.Label((t1 + t2) / 2, total.ToString() + m, style); break; default: break; } }
public Vector3 GetExpectedPosInWorld() { return(MTool.NormalizedToWorld(GetExpectedPosInNormalized())); }
public void Exec(string s) { s = s.ToLower(); Debug.Log("执行命令:" + s); string[] cmd = s.Split(' '); switch (cmd[0]) { case "print": { if (cmd.Length > 1) { Debug.Log(cmd[1]); } break; } case "printtoscreen": { if (cmd.Length > 1) { Logger.Instance.LogText.text = "nih"; } break; } case "screeninfo": { Debug.Log("screeninfo" + Screen.width + "," + Screen.height); break; } case "atan": // y x ,返回的单位是rad { if (cmd.Length >= 3) { var y = Convert.ToDouble(cmd[1]); var x = Convert.ToDouble(cmd[2]); Debug.Log(string.Format("Atan of (y={0}, x={1}) is {2}", cmd[1], cmd[2], Mathf.Atan2((float)y, (float)x))); } break; } case "mod": { if (cmd.Length >= 3) { var y = Convert.ToDouble(cmd[1]); var x = Convert.ToDouble(cmd[2]); var a = y % x; Debug.Log("a mod b=" + a); } break; } case "nor360": { if (cmd.Length >= 2) { var a = Convert.ToDouble(cmd[1]); Debug.Log("nor " + a + " to-180,180 is " + MTool.NormalizeAngleBetween_n180top180((float)a)); } break; } } }