目录
语言篇:
C#
1.Enum转数组:
2.多重排序
3.数组合并
4.定时器的使用
5.正则表达式
6.C# 类型方法扩展:
7.C# Directory.GetFiles()获取多个类型格式的文件
8.c# List获取重复项
9.C# 多个个Dictionary合并更优雅的写法
10.Vector3.Dot 前后判断
11.c# – 具有可变参数的函数的委托
引擎篇:
Unity:
1.判断各种平台
2.屏幕是否休眠
3.坐标间的转换与旋转
4.rigibody 刚体约束RigidbodyConstraints
5.Unity3d获取ParticleSystem里面的材质球的方法
6.Unity2019中简单实现音效与背景音乐的管理
插件使用
1.DOTween
修行多年,越混越惨,道爷儿很郁闷
System.Enum.GetValues(typeof(EnumKind));
listOfPeople.OrderBy(person => person.LastName)
.ThenBy(person => person.FirstName)
using System.Linq;//需要引用
new string[] { "1", "2", "3", "4" }.Concat(new string[] { "a", "b" }).ToArray();
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
System.Text.RegularExpressions.Regex.IsMatch("nmb", @"^[-]?\d+[.]?\d*$");
以字串类型为例:
" 你的偶像是{0}".TTOFormat("张国荣","本山","不二做");
1.1.ToInt();
作用:极大的提升开发效率,减少垃圾代码的出现
public static class TTOFormatHelper
{
///
/// 字符串格式化新增扩展
///
/// this T para
/// 可变参数数组
///
public static string TTOFormat(this string _str, params object[] values)
{
return string.Format(_str, values);
}
public static int ToInt(this float _float)
{
return (int)_float;
}
}
第一种方式
System.IO.Directory.GetFiles()获取多个类型格式的文件
System.IO.Directory.GetFiles("c:\","(*.jpg|*.bmp)");
第二种方式
var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".bmp") || s.EndsWith(".jpg"));
List t = new List() {
new Test(){id=1,name="车辆"},
new Test(){id=2,name="车辆"},
new Test(){id=3,name="飞机"},
new Test(){id=4,name="火车"},
new Test(){id=4,name="火车"},
};
//同名
var q = t.GroupBy(x => x.name).Where(x => x.Count() > 1).ToList();
foreach (var item in q)
{
Console.WriteLine(item.Key);
}
C# 多个个Dictionary合并更优雅的写法
Dictionary
现在有两个Dictionary的对象,想把两个对象的中数据合并成一个。
使用for循环的话觉得非常不合适,于是考虑是否有相应的方法,网上找了很多,都是for循环,最后终于找到了一个,参考:http://jworkmail.blog.163.com/blog/static/201049108201402134027951/
Dictionary a = new Dictionary();
a.Add(3, 3);
Dictionary b = new Dictionary();
b.Add(4, 6);
a=a.Concat(b).ToDictionary(k => k.Key, v => v.Value);
最后得到的a就是a与b的合并的所有元素。
横斩:
List合并(参考:http://www.cnblogs.com/liguanghui/archive/2011/11/09/2242309.html)
List listA = new List {1,2,3,5,7,9};
List listB = new List {13,4,17,29,2};
listA.AddRange(listB );把集合A.B合并
List Result = listA.Union(listB).ToList(); //剔除重复项
List Result = listA.Concat(listB).ToList(); //保留重复项
还有其他类型的合并,暂不列出。
//检测自己与玩家前后
bool IsFront()
{
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 toOther = AIControl.CurrentVehicle.transform.position - transform.position;
if (Vector3.Dot(forward, toOther) < 0)
return false;
else
return true;
}
您不能将现有的Action代理与params一起使用,但您可以通过以下方式声明自己的委托:
public delegate void ParamsAction(params object[] arguments)
然后:
// Note that this doesn't have to have params,but it can do
public void Foo(object[] args)
{
// Whatever
}
...
ParamsAction action = Foo;
action("a",10,20,"b");
当然你可以创建一个Action< object []>对于你现有的方法 – 但你失去了它的params方面,因为它没有在Action< T>中声明.例如:
public static void Foo(params object[] x)
{
}
...
Action
持续更新中... ....
官方C#源码地址:UnityCsReference
(用rider 可以直接查看C#源码,无需 下载)
PassionSpeedMgrData.Inst.OpenPaiHangBang();
//方式1 优点:实时判断所属平台
if (Application.platform == UnityEngine.RuntimePlatform.Android || Application.platform == UnityEngine.RuntimePlatform.IPhonePlayer)
{
}
UnityEngine.Debug.Log("当前平台是"+Application.platform.ToString());
//方式2: 缺点 : 受当前的工程设置影响
//#if UNITY_IOS || UNITY_ANDROID
// databasePath = string.Format("{0}/{1}", Application.streamingAssetsPath, DATA_BASE_NAME);
//#else
// databasePath = string.Format("{0}/QFPassionSpeedLine/DataBase/{1}", Application.dataPath, DATA_BASE_NAME);
//#endif
Screen.sleepTimeout = SleepTimeout.NeverSleep;
世界坐标转屏幕坐标:
Vector3 screenPos = Camera.main.WorldToScreenPoint(pos);
屏幕坐标转世界坐标:
Vector3 worldPos = Camera.main.ScreenToWorldPoint(pos);
1.最简单的旋转代码,只需要输入旋转的轴向和旋转速度就可以实现自身的旋转了
this.transform.Rotate (Vector3.up * rotaSpeed);
2.围绕某个点的旋转,参数分别是 1.需要围绕的点 2.旋转的轴向 3.旋转的速度
this.transform.RotateAround (Vector3.zero, Vector3.up, rotaSpeed);
3.旋转的角度
rotaSpeed += Input.GetAxis("Horizontal");
transform.eulerAngles = new Vector3(0, rotaSpeed, 0);
4.旋转的角度
float tiltAroundZ = Input.GetAxis("Horizontal")*30;
float tiltAroundX = Input.GetAxis("Vertical")*30;
Quaternion target = Quaternion.Euler(tiltAroundX, 0, tiltAroundZ);
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * 2);
RigidbodyConstraints为枚举类型;
(|:可以理解为又啊又啊又)
全部锁定:
rigidbody.constraints = RigidbodyConstraints.FreezePositionX| RigidbodyConstraints.FreezePositionY| RigidbodyConstraints.FreezePositionZ;
全部解锁:
rigidbody.constraints -= RigidbodyConstraints.FreezePositionX| RigidbodyConstraints.FreezePositionY| RigidbodyConstraints.FreezePositionZ;
只解锁一个(例如X轴其他全部冻结):
rigidbody.constraints ~= RigidbodyConstraints.FreezePositionX
放在这是因为找了半天才找到,郁闷,估计此问题会随unity的版本更新而导致获取方式不一致
Renderer yuanPs =transform.GetComponent
yuanPs.material;
主要是方法 AudioListener.volume = 0; 直接控制音量大小,实现最简单的管理
menuGUI.music.onValueChanged.AddListener(s => {
DisableMusicButton(menuGUI.music);
});
menuGUI.audio.onValueChanged.AddListener(s => {
DisableAudioButton(menuGUI.audio);
});
public void DisableAudioButton(Toggle toggle)
{
if (toggle.isOn)
{
AudioListener.volume = 1;
PlayerPrefs.SetInt("AudioActive", 0);
}
else
{
AudioListener.volume = 0;
PlayerPrefs.SetInt("AudioActive", 1);
}
}
public void DisableMusicButton(Toggle toggle)
{
if (toggle.isOn)
{
menuMusic.GetComponent().mute = false;
PlayerPrefs.SetInt("MusicActive", 0);
}
else
{
menuMusic.GetComponent().mute = true;
PlayerPrefs.SetInt("MusicActive", 1);
}
}
//简单使用 (通过插值的方式去修改一个值的变化)
DOTween.To(() => myValue2, x => myValue2 = x, 10, 2);
Tweener tweener = transform.DOLocalMoveX(0, 2);
tweener.SetEase(Ease.OutBounce);//动画曲线
tweener.OnComplete(OnTweenComplete);//动画结束事件
tweener.SetLoops(2);//动画循环次数
跳跃,冲压机
DOJump(new Vector3(5, 0, 0), 5, 1,5); | 假设cube坐标(0,0,0)最终跳跃到(5,0,0)位置,跳跃的中间最高度是5,跳跃1次,5秒完成 |
DOPunchPosition(new Vector3(10, 10, 10), 5); | 在 5 秒内在原始坐标和下面坐标之间,来回冲压 |
DOPunchRotation(new Vector3(50, 50, 50), 5); | 在 5 秒内在原始旋转和下面角度之间,来回冲压变化 |
DOPunchScale(new Vector3(5, 5, 5), 5); | 在 5 秒内在原始比例和下面比例之间,来回冲压变化 |
控制Itween方法:
DOComplete(); | 执行该方法,变化立即结束,且完成移动 |
DOFlip(); | 在变化过程中执行该方法,则物体慢慢的变回原样,如果变化已经完成,该方法无效 |
DOGoto(2); | 变化过程中执行该方法,则物体变化到 第二秒 时该物体的位置、比例等 |
DOKill(); | 停止掉当前的变化 |
DOPlayBackwards(); | 播放结束之前,让物体倒序运动到原位 |
DOPlayForward(); | 播放结束之前,让物体继续运动到目标位置 |
DORestart(); | 在变化结束之前,执行该方法,则重新开始变化 |
DORewind(); | 变化过程中执行该方法,回到原始 |
DOPause(); | 停止 |
DOPlay(); | 开始 |