自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 项目经历总结

游戏学习与分享

2022-07-19 15:26:04 2029 4

原创 Unity性能优化之UI

目录1.合理的划分Canvas2.Raycaster的使用3.避免使用Camera.main4.尽可能避免采用布局组5.正确的隐藏Canvas6.Atlas的使用1.合理的划分CanvasCanvas是UGUI的基本组件,它生成表示放置在其上的 UI 元素的网格,也就是说它会把一个Canvas下的所有元素合并在一个Mesh里。如果Canvas下的元素很多,任意一个元素发生位置、大小的改变,就需要重新合并所有元素的Mesh。如果元素非常多的话,可能就会造成卡顿。因此我们可以合理的划分Canvas,将需要

2022-04-18 15:53:42 4390 2

原创 Unity性能优化之Resources System

目录1.什么是Resources System2.关于Resources System的使用相关1.官方强烈建议不要使用它2.如何适当的使用Resources System?3.当项目中Resources文件夹结构复杂,内容多会对应用造成什么影响?1.内存增加,包体增加2.管理复杂度增加3.构建时间增加4.影响游戏的启动时间1.什么是Resources SystemResources System是Unity官方内置的一个资源管理系统,开发者可以将Asset资源放在一个或多个名为 Resources

2022-04-05 19:18:46 2900

原创 Unity特殊文件路径

目录1.所有的特殊文件路径Application.dataPathResourcesApplication.StreamingAssetsPathApplication.persistentDataPathApplication.temporaryCachePathCaching.GetAllCachePaths2.学习来源1.所有的特殊文件路径Application.dataPath返回的是Assets文件夹的目录,只在Editor阶段有用一般用来读取文件,创建文件夹等Resources

2022-03-04 13:34:40 303

原创 SteamVR让物体不用抓取动作自动出现在手上

案例实现之前我们实现了自定义手势的抓取,通过靠近手枪按下按键抓取手枪,但是有时候我们希望手枪一开始就出现在手上,通过阅读源码后,我尝试了下面这个示例代码可以看到,我将原先自带的Throwable脚本移除,并添加了自定义的GetGun脚本using System.Collections;using System.Collections.Generic;using UnityEngine;using Valve.VR.InteractionSystem;public class GetG

2022-02-25 21:20:53 571 1

原创 SteamVR自定义手部抓取姿势

实现一个自定义手部抓取姿势并开枪的案例1.首先准备好素材,并为其添加两个脚本和Rigidbody以及BoxColider组件2.取消勾选Interactable脚本中的Hide Hand On Attach属性,这样当我们抓取物体时可以显示手部接下来让我们为手枪的抓取添加自定义的抓取姿势,首先在手枪上添加脚本点击Create创建一个pose,把它命名为GunPose开始设计自定义手势,点击脚本上的Right Hand,将在手枪下生成手部姿势预制体然后调整好手部姿势并点击脚本上的Sa

2022-02-16 18:55:42 1134 1

原创 Unity最大值和最小值约束调整

问题现在我们有一个变量,我们希望可以在编辑器面板上自由调节它的最小值和最大值通过简单的代码编写我们很容易实现了这个功能,但是我们察觉到如果在调整时最小值不小心大于最大值,那么结果将达不到我们的预期,有什么好办法来实现这个功能呢?解决方法用该部分代码代替原有的四个变量可以看到下面两个拖动条就是我们新增的,通过拖动滑动条来赋值最大值和最小值即可解决问题,也就不会出现不小心最小值大于最大值的隐患了要实现这个效果我们需要3个脚本using System;[Serializab

2022-02-10 21:41:50 5207

原创 Unity中的编辑器扩展

目录1.RequireComponent2.AddComponentMenu3.CreateAssetMenu4.DisallowMultipleComponent5.SerializeField6.System.Serializable7.HideInInspector8.Tooltip9.Multiline10.Space11.TextArea12.Header13.Range14.Min15.ContextMenu1.RequireComponent作用:可以确保挂载该脚本的物体包含指定的组件

2022-02-10 18:26:42 1876

原创 Unity中Scriptable Object的使用总结

Scriptable Object一.什么是Scriptable Object?二.Scriptable Object可以用来做什么?1.替代enum2.作为数据容器3.扩展编辑器4.一.什么是Scriptable Object?二.Scriptable Object可以用来做什么?1.替代enumEnum的缺点:必须改代码,删改不方便,不能存储更多的数据用法如下using System.Collections;using System.Collections.Generic;using

2022-02-09 22:56:58 9133 3

原创 UnitySaveSystem的学习总结

Uniyt引擎中常见的数据存取方式一.Player Prefs二.利用JsonUtility对Prefabs进行扩展三.构建一个基于JSON的SaveSystem学习来源一.Player PrefsUnity引擎内建的主要存储玩家偏好的类,也可以用来存储简单的数据使用方法优点:作为Unity本事自建的API简单易用,只需要调用上图所示的相应函数即可缺点:存储比较复杂的数据时比较困难二.利用JsonUtility对Prefabs进行扩展JSON是一种特定格式的字符串,利用JSON

2022-02-08 23:35:02 810

原创 UnityInputSystem的使用

目录一.新输入系统相较于旧版输入系统的优势二.新输入系统的安装三.基于PlayerInput的使用四.基于C#脚本使用InputSystem(推荐)一.新输入系统相较于旧版输入系统的优势1.便于处理不同输入设备的输入信号,多平台开发2.动作基于事件,更具有灵活性和扩展性3.输入调试系统,可以准确的看到输入值4.引入了动作表,当玩家不同状态时同一按键实现不同功能二.新输入系统的安装双击打开,并添加按键三.基于PlayerInput的使用在组件上搜索添加内置的PlayerInp

2022-02-07 17:54:21 2051

原创 SteamVR组件Player和Hand的使用

SteamVR中Player组件是Interaction System的核心组件Player各个组件的介绍BodyCollider:一个表示自身位置的碰撞体组件LeftHand:左手手柄HoverPoint:手柄控制器与其他物体的接触点ObjectAttachmentPoint:游戏对象吸附的点ControllerHoverHighlight:能够实现手柄控制器高亮的效果ControllerButtonHints:显示手柄按键上的提示RightHand:右手手柄VRCamera:V

2022-01-18 18:36:46 3144 1

原创 SteamVR使用射线与UI进行交互

通过手柄发射射线与UI按钮进行交互实现在手柄控制器上添加脚本SteamVR_LaserPointer,使得手柄可以发射射线,在创建脚本LaserInteraction实现UI交互功能using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;using Valve.VR.Extras;public

2022-01-05 17:47:35 5604 5

原创 SteamVR实现凝视UI交互功能

学习笔记

2022-01-05 15:18:01 1389

原创 SteamVR中实现旋转物体操纵其他游戏对象、动画的功能

功能模块在SteamVR插件中的InteractionSystem中存在LineraMapping与LinearDisplacement组件,它们配合CircularDrive组件中的输出参数Linear Mapping可以实现用手旋转物体然后产生其他功能的作用实际例子在这个例子中我们旋转一个阀门,让其旋转的同时也在会在阀门栓上进行移动从而与现实相吻合。Circular Dirve脚本中输出参数Linear Mapping到脚本LinearMapping中,然后Linear Displace

2021-12-31 17:28:28 2310

原创 SteamVR中手柄旋转物体的功能实现

实现功能用手部去旋转场景中的物体场景模型准备一个门,注意其坐标轴中心点位于左上角,如果模型的坐标中心点与需求产生冲突可与美工沟通或者自己在Unity中用空物体进行调整然后为物体需要与手交互的地方(此处是门把手)添加碰撞器,和脚本CircularDrive关于脚本CircularDrive的属性Axis Of Rotation:物体围绕该轴进行旋转Child Colider:指定当前交互对象的子对象(默认为空即可)Linear Mapping:基于旋转的最小角度和最大角度输出0-

2021-12-31 14:58:08 2640 1

原创 SteamVR中实现物体的抓取和放回功能

学习资料来源于:SteamVR视频课在SteamVR的InteractionSystem中存在一个叫ItemPackage的模块,可以帮助我们实现道具的抓取和自动放回的效果实现方式如下ItemPackage模块分为三个脚本ItemPackageSpawner:实现交互的核心,在指定的感应区域内检测到抓取事件后在手柄上生成物体的实例,通过检测碰撞实现物体放回的交互功能,在感应区域呈现物体的预览和物体被抓取后的高亮轮廓。ItemPackage:决定单双手模式,给ItemPackageSpawn

2021-12-30 15:12:32 2395

原创 UnitySteamVR按键监听函数

三种监听HTC手柄按键的方法如何配置一个自定义的按钮方法一方法二方法三如何配置一个自定义的按钮点击+号创建 然后点击Save and generate保存 在点击 Open binding UI 打开编辑面板绑定按键最后点击替换默认按键设置保存自己的修改方法一//--在update中监听按键---不推荐private void Update() { //模范参数写按键的类型,函数参数写按键的名称,最后参数为按键的输入来源:左右手柄或任意手柄 i

2021-12-15 18:22:26 1150

原创 Unity控制第三人称和相机的移动

相机的移动using UnityEngine;using System.Collections;public class Cam360View : MonoBehaviour{ public Transform target; public float xSpeed = 200; public float ySpeed = 200; public float mSpeed = 10; public float yMinLimit = -50; publ

2021-10-10 22:46:10 263 1

原创 数据结构与算法中常用的排序算法整理

目录.冒泡排序.选择排序.插入排序.希尔排序.快速排序.归并排序-递归.归并排序-循环.堆排序.桶排序.冒泡排序#include<iostream>using namespace std;//输出数组void PrintArray(int a[],int length){ for (int i = 0; i < length; i++) { cout << a[i] << ' '; } cout << endl;}//冒泡

2021-10-10 21:06:36 157 1

原创 Unity2D游戏使用Audio System管理声音

Unity中如何播放声音播放音频所需要的条件Audio Source Component音源组件,在场景中是个小喇叭,可以认为它是一个播放器,可以在上面设置音频的属性Audio Listener Component音频接收器组件,场景中只需要一个即可,负责接收音源组件播放的声音,默认在主摄像机上Audio Clips音频文件AudioSystem的设计架构首先我们写有一个持久泛型单例,让音频管理器继承它从而不会在场景切换中被销毁using UnityE

2021-10-07 18:41:38 501

原创 Unity中应用工厂模式

工厂模式概念工厂模式(Factory Pattern)是 最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。在Unity中使用工厂类利于管理,将预制体与实例化隔开,我们不需要关心预制体是什么,需要哪些数据,工厂会替我们做好,我们只需要通过工厂的接口即可获得需要的预制体。当预制体修改时也不用在多处进行修改,只需要修改工厂即可。代码实现首先编写工厂的

2021-10-06 22:08:05 1710 2

原创 Unity和C#相关知识

目录总览Unity基础1.Unity3D中的协程(coroutine),C#线程和进程之间的区别是什么?2.Unity中碰撞器(Collider)和触发器(Trigger)的区别?3.碰撞条件和触发条件4.触发相关函数和碰撞相关函数5.Unity中常用的周期函数6.物理更新一般在哪个系统函数里?为什么?7.用代码实现第三人称角色控制器?第一人称角色控制器8.Gameobje的销毁9.UnityAction和UnityFunc的区别10.unity常用资源路径有哪些11.向量的点乘、叉乘以及归一化的意义?Un

2021-10-05 23:08:19 1672 1

原创 基于机器学习的疲劳驾驶检测系统

目录(一)课程设计内容(二)交互方式(三)开发平台/工具简介(四)总体设计(五)详细设计(六)问题及心得体会(七)参考文献,网站(一)课程设计内容驾驶疲劳检测系统,通过摄像头对驾驶员的行为进行分析,得出驾驶员是否处于疲劳驾驶状态。(二)交互方式一个简易的UI界面,通过鼠标点击方式打开摄像头,关闭摄像头进行交互 (三)开发平台/工具简介开发平台:Visual Studio 2019 (是美国微软公司的开发工具包系列产品)库:OpenCV3.42 (一个基于BSD许可(开源)发行的跨平台计算

2021-10-01 22:55:14 2352 2

原创 Unity-捕鱼达人相关知识点记录

目录(一)开始场景的制作如何将默认3D行为转换位2D行为(一)开始场景的制作如何将默认3D行为转换位2D行为点击右边属性面板中的Default Behavior Mode,区别在于2D相机的默认是正交的,3D默认是透视,额外多给一个平行光.正交视图无法看到一个物体是远离自己还是正在我们面前。为什么?因为它不会根据距离收缩。所以如果你如果你画一个固定大小的物体在视点前面,同时画一个同样大小的物体在第一个物体的远后方,你无法说那个物体是第一个。因为两个都是一样的大小,根距离无关。他们不会随着距离而收缩。

2021-08-23 00:39:24 2290

原创 C语言树的简单实现和相关算法

#include<stdio.h>#include<stdlib.h>#include<time.h>#define maxSize 10typedef struct BTNode{ char data; struct BTNode* lchild; struct BTNode* rchild;}BTNode;void init(BTNode**T){ (*T) = (BTNode*)malloc(sizeof(BTNode)); (*T)-&

2021-05-20 17:00:21 219

原创 它只是一张图片罢了

最近读了冰河大佬的博客,里面介绍了一个隐藏电影的方法首先我们将电影放入文件夹中并压缩文件夹,再找到一张图片**然后我们编写一个bat文件并执行它执行完毕后会新生成一个jpg图片然后我们其他文件删除只保留2.jpg即可现在我们如何找回我们最开始放入文件中的电影呢?只需简单将2.jpg修改成2.zip再双击打开即可最后记得将2.zip改回2.jpg,这样它又变回了一张图片很有趣的操作...

2021-05-10 22:15:10 128

原创 关于将数组满足条件表达式的元素移动的算法

设计一个算法将数组中非零元素移动到数组前端#include<stdio.h>#include<stdlib.h>void Msort(int a[],int m){ int x = -1,y=0; for (y; y < m; ++y) { if (a[y] != 0) { ++x; if (x != y) { int temp = a[y]; a[y] = a[x]; a[x] = temp; } }

2021-05-10 20:38:29 76

原创 队列的顺序存储结构和链式存储结构的实现

循环队列#include<stdio.h>#include<stdlib.h>//循环队#define maxsize 10typedef struct Squeue{ int data[maxsize]; int front; int rear;}Squeue;//初始化循环队列void init(Squeue* qu){ qu->front = 0; qu->rear = 0;}//判断队列是否为空int isQueueEmp

2021-05-09 22:52:44 221

原创 栈的顺序存储结构和链式存储结构实现

顺序栈#include<stdio.h>#include<stdlib.h>//顺序栈的定义#define maxSize 50typedef struct{ int data[maxSize]; int top;}SqStack;//初始化顺序栈void initStack(SqStack *st){ st->top = -1;}//判断栈空int isEmpty(SqStack* st){ if ((st->top) ==

2021-05-07 22:53:09 129

原创 C语言KMP算法的实现

原理参考该视频#include<stdio.h>#include<stdlib.h>//复现一下KMP算法的普通版本和改进版本,next[]数组-普通版本 nextval[]数组-改进版本int MyKmp(char str[],char substr[],int next[]);void getnext(char substr[],int next[]);void getnextval(char substr[], int nextval[]);int main

2021-05-07 18:24:28 121

原创 数据结构习题总结

1.顺序表用A[]表示,总长m+n,前m个元素有序递增,后n个元素有序递增设计一个算法使A[]整体有序递增,并分析时间和空间复杂度//思路,从下标 A(m,m+n-1) 中依次处理,与该元素前所有元素进行比较,比较途中完成移动,找到合适位置进行插入void insertElem(int A[], int m, int n){ int i = m; int temp; for (i; i < m + n; ++i) //从下标 A(m, m + n - 1) 中依次处理 { t

2021-04-26 16:37:37 232

原创 C/C++语言实现数据结构之单链表(不带头结点)

单链表相关知识#include<stdio.h>#include<stdlib.h>typedef int ElemType; //让链表存储数据为int,如果想泛化能力更强,可以采用C++的模板技术typedef struct Node{ ElemType data; Node* next;}*PNode;//初始化链表bool InitPNode(PNode& L){ L = (Node*)malloc(sizeof(Node)); if

2021-04-20 22:47:01 322

原创 C/C++语言实现数据结构之单链表(带头结点)

单链表相关知识用C语言简单实现#include<stdio.h>#include<stdlib.h>typedef int ElemType; //让链表存储数据为int,如果想泛化能力更强,可以采用C++的模板技术typedef struct Node{ ElemType data; Node* next;}*PNode;//初始化链表bool InitPNode(PNode& L){ L = (Node*)malloc(sizeof(Nod

2021-04-20 19:18:59 306

原创 PaddleOCR实现车牌识别系统

效果展示如何实现1.OpenCV环境:个人采用的是OpeCV-440-release版本,网上有很多相关教程2.PaddleOCR: 这里需要3个文件models:下载地址

2021-04-17 20:46:54 1999 4

原创 C语言实现数据结构之线性表

#include<stdio.h>#include<stdlib.h>//数据结构之线性表//特点//优点:无须为表示表中元素之间的逻辑关系而增加额外的存储空间,可以快速地存储表中任何位置的元素//缺点:插入和删除操作需要移动大量元素 当线性表长度变化较大时,难以确定存储空间的容量 会造成存储空间的”碎片”//线性表存储结构#define MaxSize 20 //最大存储空间 下标0-19typedef int ElemType; //存储的类型,这里以i

2021-04-05 21:50:17 637

原创 C++STL算法篇partition、stable_partition将满足条件的元素向前搬移算法

partition(beg,end,op)和stable_partition(beg,end,op)的特点1:迭代器类型:双向迭代器2:返回值:双向迭代器------指向第一个让op值为false的元素(搬移后)3:算法功能:将[beg,end)中满足op(elem)为true和false的元素交换位置,stable_partition会保持元素的相对次序4:复杂度:线性复杂度,后者在内存...

2020-05-05 17:14:53 235

原创 C++STL算法篇random_shuffle将区间内序列打乱算法

random_shuffle(beg,end)和random_shuffle(beg,end,op)的特点1:迭代器类型:随机存取迭代器2:返回类型:void3:算法功能:将[beg,end)区间内的元素序列打乱4:复杂度:线性复杂度#include<iostream>#include<vector>#include<functional>#in...

2020-05-05 16:44:43 661

原创 C++STL算法篇next_permutation、prev_permutation将序列变成下一字典序算法

next_permutation(beg,end)和prev_permutation(beg,end)的特点1:迭代器类型:双向迭代器2:返回值类型:bool3:算法功能:将当前序列改成下一字典序或上一字典序4:复杂度:线性复杂度#include<iostream>#include<vector>#include<functional>using...

2020-05-05 16:21:55 171

原创 C++STL算法篇rotate旋转元素次序的算法

rotate(beg,newbeg,end)和rotate_copy(beg,newbeg,end,destBeg)的特点1:迭代器类型:前向迭代器,destBeg时输出迭代器2:返回值类型:前者为void,后者为输出迭代器3:算法功能:将newbeg成为新第一元素,[beg,newbeg)区间元素放到end后面,后者将结果输出到目标迭代器4:复杂度:线性复杂度5:调用者必须保证newb...

2020-05-03 08:36:34 365

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除