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));
    }
Exemple #2
0
    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]);
    }
Exemple #3
0
    // 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);
            }
        }
    }
Exemple #4
0
    // 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);
}
Exemple #6
0
    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;
    }
Exemple #7
0
 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);
        }
    }
Exemple #10
0
 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);
     }
 }
Exemple #11
0
    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);
}
Exemple #13
0
    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;
        }
        }
    }