• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

Unity3d游戏开发框架-标志量,数学管理类,时间管

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1112/186.html

Unity3d游戏开发框架-标志量,数学管理类,时间管理,Log日志管理

 

本篇文章我们常州手机游戏开发培训-幻天网络给大家分享在游戏开发框架中常用到几个部分,包含标志量,数学管理类,时间管理,Log日志管理等,熟悉这几个相信对于大家的项目开发会很有帮助。

 

新建一个文件夹:Util

 

新建C#文件:

1.GmagFalag.cs

2.Log.cs

3.MathUtilLite.cs

4.TimeMgr.cs

 

标志量有什么用?可以标记人物的状态,攻击,奔跑·······

using UnityEngine;

using System.Collections;

public class GmagFalag

    /// <summary>

    /// 标志量

    /// </summary>

    private long mValue = 0;

    /// <summary>

    /// 标志量

    /// </summary>

    public long Value

   

        get

       

            return mValue;

       

        set

       

            mValue = value;

       

   

    public GmagFalag()

   

   

    public GmagFalag(long flag)

   

        mValue = flag;

   

    /// <summary>

    /// 添加一个标志量

    /// </summary>

    /// <param name="flag">要添加的标志量</param>

    /// <returns></returns>

    public long AddFlag(long flag)

   

        mValue |= flag;

        return mValue;

   

    /// <summary>

    /// 移除一个标志量

    /// </summary>

    /// <param name="flag">标志量</param>

    /// <returns></returns>

    public long RemoveFlag(long flag)

   

        mValue &= ~flag;

        return mValue;

   

    /// <summary>

    /// 添加或移除一个标志量

    /// </summary>

    /// <param name="remove">是否移除</param>

    /// <param name="flag">标志量</param>

    /// <returns></returns>

    public long ModifyFlag(bool remove,long flag)

   

        mValue = remove ? RemoveFlag(flag) : AddFlag(flag);

        return mValue;

   

    /// <summary>

    /// 某个标志量是否存在

    /// </summary>

    /// <param name="flag">标志量</param>

    /// <returns></returns>

    public bool HasFlag(long flag)

   

        return ((mValue & flag) != 0);

   

下面是对GmagFalag测试代码:

using UnityEngine;

using System.Collections;

public class TestGmagFalag : MonoBehaviour 

    public enum PlayerAction : long

   

        Attack = 1L,

        Run = 1L << 1,//右移运算符

        CoolDown = 1L << 2,

   

    GmagFalag flag = new GmagFalag();

    void Awake() 

   

        flag.AddFlag((long)PlayerAction.Attack);

   

    void Start()

   

        if (flag.HasFlag((long)PlayerAction.Attack))

       

            Debug.Log("-------------");

            flag.RemoveFlag((long)PlayerAction.Attack);

            flag.AddFlag((long)PlayerAction.Run);

            flag.AddFlag((long)PlayerAction.CoolDown);

       

        if (!flag.HasFlag((long)PlayerAction.Attack) 

            && flag.HasFlag((long)PlayerAction.Run)

            && flag.HasFlag((long)PlayerAction.CoolDown))

       

            Debug.Log("Has Two");

       

   

    void Update() 

   

   

using UnityEngine;

using System.Collections;

public class Log

 

    public delegate void LogFunc(object obj);

    public static LogFunc Error = UnityEngine.Debug.LogError;

#if UNITY_EDITOR

    public static LogFunc Debug = UnityEngine.Debug.Log;

    public static LogFunc Warning = UnityEngine.Debug.LogWarning;

#else

    public static void Debug(object obj)

   

   

    public static void Warning(object obj)

   

   

#endif

 

 

 

using UnityEngine;

using System.Collections;

using System;

public class MathUtilLite

    #region 常量

    public static Vector3 AxisX = new Vector3(1, 0, 0);

    public static Vector3 AxisY = new Vector3(0, 1, 0);

    public static Vector3 AxisZ = new Vector3(0, 0, 1);

    public static Vector3 XYZ1 = Vector3.one;

    public static float ONE_DIV_PI = 1.0f / Mathf.PI;

    public static float COS_15 = Mathf.Cos(Mathf.Deg2Rad * 15.0f);

    public static float COS_35 = Mathf.Cos(Mathf.Deg2Rad * 35.0f);

    public static float COS_45 = Mathf.Cos(Mathf.Deg2Rad * 45.0f);

    public static float COS_75 = Mathf.Cos(Mathf.Deg2Rad * 75.0f);

    public static float COS_60 = Mathf.Cos(Mathf.Deg2Rad * 60.0f);

    public static float COS_30 = Mathf.Cos(Mathf.Deg2Rad * 30.0f);

    public static float COS_20 = Mathf.Cos(Mathf.Deg2Rad * 20.0f);

    public static Vector2 AxisX2D = new Vector2(1, 0);

    public static Vector2 AxisY2D = new Vector2(0, 1);

    public static float EPSILON = 0.001f;

    #endregion

    /// <summary>

    /// 时间戳转换成时间

    /// </summary>

    /// <param name="t">时间戳</param>

    /// <returns></returns>

    public static System.DateTime TransToDateTime(uint t)

   

        System.DateTime dt = System.TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));

        long lTime = long.Parse(t.ToString() + "0000000");

        System.TimeSpan toNow = new System.TimeSpan(lTime);

        return dt.Add(toNow);

   

    /// <summary>

    /// 计算两个三维坐标相差的距离

    /// </summary>

    /// <param name="a"></param>

    /// <param name="b"></param>

    /// <returns>距离</returns>

    public static float DistancePow(Vector3 a, Vector3 b)

   

        return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z);

   

    /// <summary>

    /// 计算两个二维坐标相差的距离

    /// </summary>

    /// <param name="a"></param>

    /// <param name="b"></param>

    /// <returns>长度</returns>

    public static float DistancePow(Vector2 a, Vector2 b)

   

        return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);

   

    //andeeee from the Unity forum's steller Catmull-Rom class ( http://forum.unity3d.com/viewtopic.php?p=218400#218400 ):

    public static Vector3 Interp(Vector3[] pts, float t)

   

        t = Mathf.Clamp(t, 0.0f, 2.0f);

        int numSections = pts.Length - 3;

        int currPt = Mathf.Min(Mathf.FloorToInt(t * numSections), numSections - 1);

        float u = t * numSections - currPt;

        Vector3 a = pts[currPt];

        Vector3 b = pts[currPt + 1];

        Vector3 c = pts[currPt + 2];

        Vector3 d = pts[currPt + 3];

        return .5f * (

            (-a + 3f * b - 3f * c + d) * (u * u * u)

            + (2f * a - 5f * b + 4f * c - d) * (u * u)

            + (-a + c) * u

            + 2f * b

        );

   

    /// <summary>

    /// 获取两个点间的夹角

    /// </summary>

    /// <param name="form"></param>

    /// <param name="to"></param>

    /// <returns></returns>

    public static float GetAngle(Vector3 form, Vector3 to)

   

        Vector3 nVector = Vector3.zero;

        nVector.x = to.x;

        nVector.y = form.y;

        float a = to.y - nVector.y;

        float b = nVector.x - form.x;

        float tan = a / b;

        return Mathf.Atan(tan) * 180.0f * ONE_DIV_PI;

   

    public static Vector3 ApproximateDir(Vector3 dir)

   

        float dotX = Vector3.Dot(dir, AxisX);

        float dotZ = Vector3.Dot(dir, AxisZ);

        if(Mathf.Abs(dotX) > Mathf.Abs(dotZ))

       

            return dotX > 0 ? AxisX : -AxisX;

       

        else

       

            return dotZ > 0 ? AxisZ : -AxisZ;

       

   

    /// <summary>

    /// normalize 并且返回 长度

    /// </summary>

    /// <param name="vec"></param>

    /// <returns></returns>

    public static float Normalize(ref Vector3 vec)

   

        float length = Mathf.Sqrt((vec.x * vec.x) + (vec.y * vec.y) + (vec.z * vec.z));

        if (length > 0)

       

            float oneDivLength = 1.0f / length;

            vec.x = vec.x * oneDivLength;

            vec.y = vec.y * oneDivLength;

            vec.z = vec.z * oneDivLength;

       

        return length;

   

    /// <summary>

    /// 尝试到达那个点

    /// </summary>

    /// <param name="dest"></param>

    /// <param name="cur"></param>

    /// <param name="speed"></param>

    /// <param name="time"></param>

    /// <returns></returns>

    public static Vector3 TryToMoveToPosWithSpeed(Vector3 dest, Vector3 cur, float speed, float time)

   

        Vector3 dir = dest - cur;

        float dis = Normalize(ref dir);

        if (speed * time < dis)

       

            return cur + dir * speed * time;

       

        else

       

            return dest;

       

   

    /// <summary>

    /// 移动人物制定距离相差多少的值

    /// </summary>

    /// <param name="dest">目标点</param>

    /// <param name="cur">当前坐标</param>

    /// <param name="speed"></param>

    /// <param name="time">速度</param>

    /// <returns></returns>

    public static Vector3 OffsetToMoveToPosWithSpeed(Vector3 dest, Vector3 cur, float speed, float time)

   

        Vector3 dir = dest - cur;

        Vector3 maxOffset = dir;

        float dis = Normalize(ref dir);

        if (speed * time < dis)

       

            return dir * speed * time;

       

        else

       

            return maxOffset;

       

   

    /// <summary>

    /// float 近似相等

    /// </summary>

    /// <param name="a"></param>

    /// <param name="b"></param>

    /// <returns></returns>

    public static bool IsEqualFloat(float a, float b)

   

        return (Math.Abs(a - b) < 0.001f);

   

    public static bool IsEqualFloatRaw(float a, float b)

   

        return (Math.Abs(a - b) < 0.05f);

   

    #region 3D空间投影到屏幕坐标

    public static Vector2 ProjectToScreen(Camera cam, Vector3 point)

   

        Vector3 screenPoint = cam.WorldToScreenPoint(point);

        return new Vector2(screenPoint.x, screenPoint.y);

   

    #endregion

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class TimeMgr : MonoBehaviour 

    private static TimeMgr mInstance;

    public static TimeMgr Instance

   

        get

       

            return mInstance;

       

   

    public delegate void Interval();

    private Dictionary<Interval, float> mDicinterval = new Dictionary<Interval, float>();

    public void AddInterval(Interval interval,float time)

   

        if (null != interval)

        mDicinterval[interval] = Time.time + time;

   

    public void RemoveInterval(Interval interval)

   

         if (null != interval)

        

             if (mDicinterval.ContainsKey(interval))

            

                 mDicinterval.Remove(interval);

            

        

   

    // Awake is called when the script instance is being loaded.

    void Awake() 

   

        mInstance = this;

   

    void Update()

   

        if(mDicinterval.Count > 0)

       

            List<Interval> remove = new List<Interval>();

            foreach(KeyValuePair<Interval,float> KeyValue in mDicinterval)

           

                if (KeyValue.Value <= Time.time)

               

                    remove.Add(KeyValue.Key);

               

           

            for (int i = 0; i < remove.Count;i++ )

           

                remove[i]();

                mDicinterval.Remove(remove[i]);

           

       

   



上篇:上一篇:Unity3D创建txt文件,管理prefab路径
下篇:下一篇:Unity项目架构设计与开发管理