游戏研发 奇技淫巧(持续更新中)

目录

语言篇:

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



修行多年,越混越惨,道爷儿很郁闷


语言篇:

C#

1.Enum转数组:

System.Enum.GetValues(typeof(EnumKind));

2.多重排序

listOfPeople.OrderBy(person => person.LastName)
   .ThenBy(person => person.FirstName)

3.数组合并

using System.Linq;//需要引用

new string[] { "1", "2", "3", "4" }.Concat(new string[] { "a", "b" }).ToArray();

4.定时器的使用

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

5.正则表达式

System.Text.RegularExpressions.Regex.IsMatch("nmb", @"^[-]?\d+[.]?\d*$");

6.C# 类型方法扩展:

以字串类型为例:

" 你的偶像是{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;
    }
}

7.C# Directory.GetFiles()获取多个类型格式的文件

第一种方式

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"));

8.c# List获取重复项

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);
            }

9.C# 多个个Dictionary合并更优雅的写法

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();        //保留重复项
还有其他类型的合并,暂不列出。

10.Vector3.Dot 前后判断

    //检测自己与玩家前后
    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;
    }

11.c# – 具有可变参数的函数的委托

您不能将现有的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 func = Foo;
func("a","b"); // Invalid
func(new object[] { "a","b" }); // Valid
因此,如果您从想要使用params的代码调用委托,则需要一个委托类型,其中包含声明中的委托类型(根据第一部分).如果您只想创建一个接受对象[]的委托,那么您可以创建一个Action< object []>的实例.使用一种在其签名中具有参数的方法 – 它只是一个有效的修饰符.

 

持续更新中... ....

引擎篇:

Unity:

官方C#源码地址:UnityCsReference

(用rider 可以直接查看C#源码,无需 下载)

1.判断各种平台

 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

2.屏幕是否休眠

Screen.sleepTimeout = SleepTimeout.NeverSleep;

3.坐标间的转换与旋转

世界坐标转屏幕坐标:

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);

4.rigibody 刚体约束RigidbodyConstraints

RigidbodyConstraints为枚举类型; 
(|:可以理解为又啊又啊又) 
全部锁定: 
rigidbody.constraints = RigidbodyConstraints.FreezePositionX| RigidbodyConstraints.FreezePositionY| RigidbodyConstraints.FreezePositionZ; 
全部解锁: 
rigidbody.constraints -= RigidbodyConstraints.FreezePositionX| RigidbodyConstraints.FreezePositionY| RigidbodyConstraints.FreezePositionZ; 
只解锁一个(例如X轴其他全部冻结): 
rigidbody.constraints ~= RigidbodyConstraints.FreezePositionX

5.Unity3d获取ParticleSystem里面的材质球的方法

放在这是因为找了半天才找到,郁闷,估计此问题会随unity的版本更新而导致获取方式不一致

Renderer yuanPs =transform.GetComponent();
yuanPs.material;

6.Unity2019中简单实现音效与背景音乐的管理

    主要是方法 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);
        }
    }


 

插件使用

1.DOTween

//简单使用 (通过插值的方式去修改一个值的变化)
	    DOTween.To(() => myValue2, x => myValue2 = x, 10, 2);

	    Tweener tweener = transform.DOLocalMoveX(0, 2);
	    tweener.SetEase(Ease.OutBounce);//动画曲线
	    tweener.OnComplete(OnTweenComplete);//动画结束事件
	    tweener.SetLoops(2);//动画循环次数

游戏研发 奇技淫巧(持续更新中)_第1张图片

跳跃,冲压机

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(); 开始

你可能感兴趣的:(游戏研发备忘录)