- 博客(16)
- 收藏
- 关注
原创 Unity 对列表中的类按照其元素的排序以及多次排序
这样我们就已经把此类以编号为基准进行了升序降序排列,若此时列表中有相同的编号,列表则会根据索引自动进行二次排列。但是若我们想通过自己的标准进行二次排列,例如按照Value的大小对此时的列表进行二次排列。我们可以在升序或降序之后,再次进行多次的ThenBy或者是ThenByDescending来进行对一个类的不同属性的多次排列。使用此方法对类型枚举筛选后再去筛选类型中的其他数值进行排序也是一种非常实用的方式,可以快速完成对列表的排列。例如此处有一个类,拥有的元素为编号和值。
2023-07-18 17:29:38 718 1
原创 Unity 简单事件系统的实现
事件系统可以通过广播对注册该事件的脚本执行相对应的行为,不用明确接受对象是谁,可以轻松的实现一对多的应用,下面来实现一个简易的事件系统的实现。1.首先创建脚本 EventManagerpublic class EventManager{ //接口。只负责存在在字典中 public interface IRegisterations { } //多个注册 public clasee Registerations<T> : IRegisterations { //委托本
2022-04-19 17:20:51 3892 1
原创 Unity List使用Find或FindAll查找特定元素以及特定元素个数
在开发过程中,有时会需要在List中查找某个特定元素,这时我们可以使用List的Find方法来实现,实例如下:1.首先我们定义一个Student类来模拟我们所需要的的类,每个student有他的学号(Number)和姓氏(LastName)。public class student{ public int Number; public string LastName;}2.建立一个脚本,声明Students为List,并声明几个student在List中。private List<s
2022-03-10 10:15:35 12644
原创 Unity关于IsPointerOverGameObject接口真机失效问题
在制作游戏时,有时需要发射射线执行游戏的相关功能,但是在点击UI的同时,却也会触发游戏内的相关功能,为了规避此事件的发生,Unity提供了一个名为EventSystem.current.IsPointerOverGameObject()的函数,使用这个函数可以规避点在UI上依旧会触发游戏功能。但是在电脑上运行无误,打包成apk到真机上之后,这个函数会失效。所以我们用如下代码对此接口进行优化,示例代码如下: public static bool IsPointerOverGameObject()
2021-10-12 15:18:23 2551
原创 Unity 射击游戏的准星位置
做有射击元素的游戏制作准星时,随着物体的旋转以及视线偏移可能会产生一定的的误差,使得子弹(射线)发射的初始位置不在屏幕正中央,所以制作准星时,应该基于屏幕的宽高进行衡量。示例代码如下: RaycastHit rayhit; Ray dirRay = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2)); if (Physics.Raycast(dirRay, out rayhit,100,~(1 &
2021-10-12 14:37:45 2987 1
原创 Unity限制旋转角度
游戏制作时,有时会有限制某些物体旋转角度的需求,可以使用以下代码进行限制,此方法为使用了Mathf.Clamp来返回最大值和最小值之间的值,使填入的值不超出解限,然后不断赋值物体给新的旋转坐标,下面为限制Y轴的示例。 LimitViewY(-0.4f,0.35f); public void LimitViewY(float minView,float MaxView) { float rotationY = Mathf.Clamp(Player.transform.rotation.y, minV
2021-10-12 14:24:39 7351
原创 Unity通过反射创建动态类
在游戏制作过程中,难免会遇到一些不方便进行挂载缺需要调用的脚本,这时候我们可以使用反射来动态创建类,并且调用其类中的方法。1.首先先要获取到需要动态创建类的类名。CurrentWeapon为当前武器名称,这里使用了武器名+Fire的统一命名方法来区分不同武器的开火类。 private WeaponBase m_CurrentWeapon; Type type = Utility.Assembly.GetType(CurrentWeapon+"Fire");2.如果该类存在且不为空,则动态创
2021-10-12 14:01:11 1704
原创 Unity 在Update中限定每几帧执行一次
众所周知,在Unity中,Update中的函数是每一帧执行一次,但有时候我们需要其执行的不那么频繁,如开枪时的间隔,角色跳跃等。所以可以通过以下代码限制Update中的执行速率: if (Input.GetMouseButton(0)) { if (Time.frameCount % 5 == 0) { Fire(); } }这样就不会每一下按鼠标都判断了,而是每5帧进行一次判断。...
2021-10-12 09:49:07 5444
原创 Unity 用于投掷物品的一阶贝塞尔曲线
首先一阶贝塞尔曲线公式为: /// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param> /// <param name="start">曲线的起始位置</param> /// <param name="center">决定曲线形状的控制点</param> /// <param name="end">曲线的终点</param> publi
2021-10-11 18:29:21 878
原创 基于UnityGameFramework框架的AssetBundle打包
1.在Unity中,打开菜单栏中的GameFramework的ResourceTool,其中个人常用以下几种:(1)ResourceEditor:用于将此游戏所需要打包为AB包的素材进行填入。将右边的所需要填入的资源选中后点击下方的双箭头填入到相对应的打包文件当中。全部规整完毕之后点击右下角的Save进行保存(一定!)。Clear可以清空打包列表。(2)ResourceAnalyzer:资源分析,用来分析资源冲突和资源依赖。【1】进入界面后先进行资源分析(Summary中的Analyze)可以分析
2021-07-13 19:11:05 1530
原创 Unity Button长按检测
调用Unity自带接口即可,代码如下:public class upSpeed : MonoBehaviour,IPointerDownHandler,IPointerUpHandler{ // Start is called before the first frame update private void Awake() { this.gameObject.GetComponent<Button>(); } // Update i
2021-05-15 14:53:55 1250 1
原创 SourceTree版本回溯以及单个改动版本回溯
1.整体版本回溯(1)选择想要回到的版本,右击选择重置当前分支到此次提交。(2)随后弹窗,选择强行合并,点击确认即可。2.单个改动版本回溯(1)选中想要改变的单个对象,右键选定项目的变更历史。(2)选择想要改变到的版本,右键重置到提交即可。...
2021-05-15 14:50:48 943
原创 Unity内置地形Terrain优化
原因:Terrain较大时面数、顶点数和Batches会大幅上升,会严重降低手机的fps。原理:用插件Mesh Terrain Editor把地形转换为Mesh-Terrain,也就是1个带有特殊地形shader的mesh。步骤:1、Asset Store上搜索Mesh Terrain Editor下载插件;2、先在层级视图上选中要被转换的Terrain,然后按照下图操作:3、更改一些参数,一般只改图中箭头所指的4个就行:默认.obj格式就行;顶点数可以选择默认50,如果地图很大可以填大一些
2021-05-15 13:47:23 5304
原创 使用Render Texture在UI上显示3D模型动画
1.首先需要新建一个Render Texture,调试好相对应的属性。这里要注意Size尽量和后期UI上的大小相对应,要不然投射出来的会很糊。2.若是要在UI上显示3D模型及其动画,就要确保模型在场景里能被某个摄像机拍到。我们把模型放在场景中,并且新建一个摄像机对准模型。3.然后来调整这个摄像机的属性,首先要把Render Texture拖拽到Target Texture中。然后根据实际情况来调整Depth,记得勾选掉AudioListener防止发生冲突。若此模型不是常驻在UI中,需要特殊情况
2021-05-15 11:16:11 1436
原创 基于UnityGameFramework框架的临时数据节点使用
1.数据节点是可以对游戏中产生的临时变量进行存储或者读取的节点,要是用数据节点,首先要确保在Constant中含有DataNote脚本。新建一个脚本名为:“Constant.DataNode”,具体代码如下:namespace MyGameNameSpace{ public static partial class Constant { /// <summary> /// 数据节点,用来存储游戏中的临时变量 /// </s
2021-05-15 10:26:21 540 1
原创 EzySlice切割人物
1.首先EzySlice只可以切割静态网格,所以开始需要在人物的预制体或模型上建立一个脚本“CreateStaticMesh”用于创建与当前角色状态相同的静态蒙皮。代码如下所示:public void CreateStaticMesh(){Mesh staticMesh = new Mesh();skinnedMesh.BakeMesh(staticMesh);GameObject newGo = new GameObject();newGo.tag = “Target”;newGo.tran
2021-05-15 09:15:47 593 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人