您的位置:首页 > 移动开发 > Unity3D

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

2016-08-31 18:23 471 查看
原文链接:http://blog.csdn.net/u013108312/article/details/52387638

新建一个文件夹: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]);
}
}

}
}


原文链接:http://blog.csdn.net/u013108312/article/details/52387638
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d 框架