- 博客(45)
- 资源 (4)
- 收藏
- 关注
原创 Unity问题(1)——mesh法线反转
将模型导入Unity后,发现模型正反面颠倒了,百度后发现需要将模型mesh法线反转。这里有两种方式:运行时进行法线反转,不会改变预制件中的模型,关闭运行后会恢复原样。代码如下(line是public GameObject line,在Unity中将想要法线反转的模型拖入其中): Vector3[] normals = line.GetComponent<MeshFilter>().mesh.normals; for (int i = 0; i < normals.Length
2021-04-05 14:20:45 6865
原创 priority_queue自定义比较函数(实用向)
优先队列,比较pair元素,实现按第一个值降序,第一个值相同,按第二个值升序。其它情况均可通过修改cmp类实现。struct cmp { bool operator()(pair<int,int>& a, pair<int,int>& b) { if (a.first == b.first) return a.second > b.second; else return
2021-03-14 16:13:46 1813
原创 一些MRTK的组件(看到了就写一下,没看到就算了)
版本:2.4.0Object collection(排列一组对象)支持各种曲面样式,支持任何对象,可以用于布局2D和3D对象。具体信息见官方文档Object collection部分
2021-01-03 16:33:20 1649 1
原创 Unity+MRTK(2):用于Hololens的Main Camera初始设置
内容来自官方文档操作系统:Win10Unity版本:2019.4MRTK版本:2.4.0全息设备:Hololens2若要优化全息设备的视觉质量和全息稳定性,应对Unity中的相机对象做特定设置(下面只挑选了Hololens2相关的设置并有部分针对性的改动,关于其他设备可以自行查看官方文档)。项目设置file>Build Setting,确保选择的平台是Universal Windows PlatformEdit>Project Settings>Player>XR
2020-12-26 16:04:41 4694
原创 Unity+MRTK(1):实现常见空间交互
内容来自官方文档操作系统:Win10Unity版本:2019.4MRTK版本:2.4.0主要内容抓取和移动对象精确移动或旋转对象(边界控制)使对象响应输入事件添加视觉反馈添加音频反馈添加HoloLens 2 样式按钮预制件实现对象跟随使对象始终朝向自己抓取和移动对象附加 ObjectManipulator.cs(支持双手缩放旋转) 和 NearInteractionGrabbable.cs脚本,使对象可抓取 ,对象需要有Box Collider组件(组件中的Material属性选择Manipul
2020-12-25 13:30:20 2533 4
原创 Hololens2仿真器 模拟手势输入
内容来自官方文档英文版:In the HoloLens 2 Emulator, the cursor follows hand movement and orientation.Walk forward, back, left, and right - Use the W,A,S, and D keys on your keyboard, or the left stick on an Xbox controller.Look up, down, left, and right - Click a
2020-12-24 12:20:04 978
原创 unity基础(8)——3D场景添加音频
内容参考Unity官方基础教程操作系统:Win10Unity版本:2019.4添加背景音频背景音频的音量不会因为距离而发生变化。步骤:选择一个GameObject,在Inspector窗口点击Add Component,搜索并选择Audio Source组件组件中自带一些可用属性,比如播放时唤醒(Play On Awake)、静音(Mute)、循环播放(Loop)等点击AudioClip属性右侧的圆形图标在出现的窗口中双击选择一个音频(前提是Assets文件夹下已经有音频文件,没有
2020-12-19 19:22:10 3298 1
原创 unity基础(7)——一些Unity API
内容参考Unity官方基础教程操作系统:Win10Unity版本:2019.4Visual Studio版本:2019(Community)详细API见Unity API改变GameObject的Transform(Position/Rotation/Scale)API位置// 改变GameObject的Scaletransform.localScale += scaleChange;// 改变GameObject的Positiontransform.position += positi
2020-12-18 18:02:04 148 2
原创 Kibana启动报错:[resource_already_exists_exception]
运行Kibana.bat,启动失败,报错大概意思是已经存在一个启动的Kibana了,但明明是第一次启动报错:[warning][savedobjects-service] Unable to connect to Elasticsearch. Error: [resource_already_exists_exception] index [.kibana_task_manager_1/_2s2vHazSRqCl7dPlZ_oQQ] already exists, with { index_uuid=
2020-12-18 13:43:30 6876 6
原创 unity基础(6)——编写第一个脚本Hello World
内容参考Unity官方基础教程操作系统:Win10Unity版本:2019.4Visual Studio版本:2019(Community)创建新脚本创建一个空的GameObject,可以将其命名为ScriptObject选中ScriptObject,在Inspector窗口点击Add Component,选择New Script选项这里将脚本命名为HelloWorld,点击Create and Add按钮此时脚本会作为组件添加到ScriptObject中,同时会出现在Assets文件
2020-12-17 18:05:24 857
原创 unity基础(5)——安装配置Visual Studio
内容参考Unity官方基础教程操作系统:Win10Unity版本:2019.4Visual Studio版本:2019(Community)确认是否安装了Visual StudioUnity界面,Edit>Preferences,选择External Tools点开External Script Editor的下拉菜单,如果里面有Visual Studio选项,说明已安装好,选择该Visual Studio即可。电脑里已经安装了Visual Studio但Unity搜不到这说明你的V
2020-12-17 14:59:36 10045 1
原创 unity基础(4)——项目打包过程
内容来自Unity官方基础教程操作系统:Win10Unity版本:2019.4选择File>Build Setting或者快捷键Ctrl+Shift+B,打开Build Setting点击Add Open Scenes按钮,将当前场景放入Scenes In Build框(如果要打包多个场景,,可以将其他场景拖入其中),打包前注意场景顺序(通过拖拽改变顺序),让最开始显示的场景放在最前面,序号为0选择项目的目标平台,如果目标平台无法点击Build,则需要打开Unity Hub>安装
2020-12-16 19:10:22 4419
原创 unity基础(3)——从Unity Asset store获取资源
内容来自Unity官方基础教程操作系统:Win10Unity版本:2019.4打开Unity Asset store,登陆自己的Unity ID搜索自己想要的资源,比如"material",可以调整价格区间或直接选择免费资源点击自己想要的资源,点击添加至我的资源(这里需要注意是否兼容自己的Unity版本),免费资源不需要其它操作,付费资源需要一系列的付费操作。成功添加后,该资源就会出现在“我的资源”中,可以从 “我的资源”页面点击“在Unity中打开”,也可以在Unity软件界面>Wi
2020-12-16 15:09:02 3770
原创 unity基础(2)——3D对象基础概念与简单操作
3D对象基础概念与简单操作在Unity Hub创建项目时选择3D模板。初始界面默认3D场景中只有一个相机和太阳,Hierarchy窗口也只有对应的两个GameObject。Main Camera:控制游戏视图时的视野;Directional Light:模拟太阳,产生遇到GameObject会反射的光线。创建简单3D对象在Hierarchy窗口单击鼠标右键,选择3D Object,然后可以选择多种基本对象(primitives)。这里选择Cube,这时Hierarchy窗口和场景视图
2020-12-13 19:50:53 3920
原创 unity基础(1)——unity编辑器的基本介绍
Unity编辑器的基本介绍Unity编辑器界面在基本的编辑器界面有五个关键区域。Scene view(场景视图)和Game view(游戏视图)场景视图:与自己创建的世界进行交互的窗口。可以在场景视图中操控对象并从各个角度查看。游戏视图:使用游戏视图进行游戏测试(需要点击Toolbar中间的Play按钮)。还可以调整游戏画面的长宽比(默认是Free Aspect)和缩放程度(Scale)。Hierarchy window(层级窗口)场景视图中的所有对象(叫做GameObject)都会出现在层
2020-12-10 19:39:58 5904
原创 golang基础小记(24)——reflect.DeepEqual函数:判断两个值是否一致
对于array、slice、map、struct等类型,想要比较两个值是否相等,不能使用==,处理起来十分麻烦,在对效率没有太大要求的情况下,reflect包中的DeepEqual函数完美的解决了比较问题。函数签名:func DeepEqual(a1, a2 interface{}) bool文档中对该函数的说明:DeepEqual函数用来判断两个值是否深度一致:除了类型相同;在可以时(主要是基本类型)会使用==;但还会比较array、slice的成员,map的键值对,结构体字段进行深入比对。ma
2020-08-28 18:30:46 11405
原创 golang包的日常(5)——sync包:并发同步;sync/atomic包:原子级内存操作
package syncimport "sync"sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。注意:本包的类型的值不应被拷贝。sync.WaitGrouptype WaitGroup struct { // 包含隐藏或非导出字段}WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程
2020-08-26 13:43:06 401
原创 golang包的日常(4)——math/rand包:生成随机数
package randimport "math/rand"rand包实现了伪随机数生成器。常用随机数生成方法这里只介绍自己用到过的部分,更多函数/方法请参考标准库文档中文版rand.Seed:设置随机数种子func Seed(seed int64)使用给定的seed将默认资源初始化到一个确定的状态;如未调用Seed,默认资源的行为就好像调用了Seed(1)。如果程序每次运行,随机数种子都相同,那么使用随机数函数得到的随机数都是一样的,想让程序每次运行得到的随机数都不同,就需要让每次的随
2020-08-17 18:21:19 1753
原创 golang基础小记(22)——并发之goroutine:使用方式、sync.WaitGroup
goroutineGo语言的并发通过goroutine实现,其概念类似于线程,属于用户态的线程,我们可以创建无数个goroutine并发工作。goroutine是由Go的运行时(runtime)来调度和管理的。使用方式启动goroutine只需要在调用的函数前加上go关键字,函数可以是普通函数也可以是匿名函数。在程序启动时,Go程序会为main()函数创建一个默认的goroutine。它会在main()函数返回的时候结束,此时所有在main()函数中启动的goroutine不管有没有运行完都会一同结
2020-08-17 17:30:54 285
原创 golang包的日常(3)——strconv包:基本数据类型和其字符串表示的相互转换
package strconvimport "strconv"strconv包实现了基本数据类型和其字符串表示的相互转换。下面介绍比较常用的转换函数,更多内容参考标准库文档中文版string与int互转ParseInt:字符串转int64func ParseInt(s string, base int, bitSize int) (i int64, err error)返回字符串表示的整数值,接受正负号。base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16
2020-08-16 17:30:33 232
原创 golang基础小记(21)——反射
反射是指在程序运行期间对程序本身进行访问和修改的能力。反射的应用:当我们用空接口接收不同类型的结构体时,很难用类型断言去判断类型(因为自定义类型可以随意取名),这时就可以用到反射,来来得到结构体的类型,并进一步得到字段和对应值。注意:反射引起的panic在编译时不会产生,只有在运行时才能发现,所以代码比较脆弱应用反射的代码通常难以理解反射的性能更低所以在写代码时要尽量避免使用反射,除非只能使用反射!(这也是我不想写细致内容的借口。。。以后用到再说。。。)reflect包提供反射相关功能。
2020-08-14 12:21:14 289
原创 golang基础小记(20)——将格式化字符串作为函数参数
直接上简单实例:package mainimport "fmt"func formatAsArgs(format string, a ...interface{}) { s := fmt.Sprintf(format, a...) fmt.Println(s)}func main() { name := "小明" id := 10086 formatAsArgs("name:%s, id:%d", name, id) // name:小明, id:10086 formatAsAr
2020-08-10 17:22:01 456
原创 golang基础小记(19)——runtime.Caller简单使用:获取函数名和对应的文件名、行号
runtime.Caller函数签名:func Caller(skip int) (pc uintptr, file string, line int, ok bool)Caller报告当前go程调用栈所执行的函数的文件和行号信息。实参skip为上溯的栈帧数,0表示Caller的调用者(Caller所在的调用栈)。函数的返回值为调用栈标识符、带路径的完整文件名、该调用在文件中的行号。如果无法获得信息,ok会被设为false。根据pc获取函数名根据返回的调用栈标识符pc,我们可以获取对应的函数名。
2020-08-10 15:45:16 3253
原创 golang包的日常(2)——log包
普通使用log包定义了Logger类型,该类型提供了一些格式化输出的方法。log包中预定义了一个标准logger对象std,使我们可以直接调用函数来打印日志,默认是标准错误输出(Stderr),打印到终端界面。当然也可以自定义创建logger对象,控制std所调用的所有函数在内部都是调用了同名的logger类型的方法。函数包括:Print()、Printf()、Println()Fatal()、Fatalf()、Fatalln():触发fatal,写入日志信息后调用os.Exit(1),程序直接
2020-08-09 15:28:48 307
原创 golang包的日常(1)——time包
时间类型时间类型:time.Time我们可以通过time包中的Now函数获取当前本地时间,然后使用时间类型的方法得到当前本地时间的年、月、日等信息。Now()函数格式:// // Now returns the current local time.func Now() Time示例:now := time.Now()fmt.Println(now) // 2020-08-08 13:25:18.5419281 +0800 CST m=+0.0019
2020-08-08 16:06:35 589
原创 golang基础小记(18)——文件操作:文件开关、简单的读写实例、设置文件读写位置、文件删除、文件名重命名、文件操作相关方法/函数补充
文件打开和关闭os包中Open()函数能够以只读方式打开一个文件,函数返回*File和err。打开的文件可以通过调用Close()方法关闭。Open()函数定义:func Open(name string) (*File, error)Open()函数接收文件路径,返回一个文件指针和可能的具体错误。Close()方法定义:func (file *File) Close() error示例:import ( "fmt" "os")func main() { file, err
2020-08-07 13:00:33 373
原创 golang基础小记(17)——包(package):自定义包、标识符可见性、导入、init()函数、简单实例
定义包一个包可以简单理解为一个存放.go文件的文件夹。这些go文件都归属于该包,通过在代码第一行声明实现。声明格式:package 包名注意:一个包下面的所有文件只能归属于同一个包。包名可以和文件夹名不同,包名不能包含-符号。main包是应用程序的入口包,只有main包才会在编译后生成可执行文件。包中标识符的对外可见性标识符包括变量、常量、类型、函数等,还有结构体中的字段名、接口中的方法名,Go语言中只要将标识符的首字母大写,就可以让该标识符对外可见。导入包使用import关键字导
2020-08-06 14:00:41 392
原创 golang基础小记(16)——接口(interface):基本概念、接口嵌套、空接口、类型断言(获取接口底层值)
基本概念定义Go语言中接口(interface)是一种类型,一种抽象的类型。接口类型是由一组方法签名定义的集合。接口的定义格式:type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 …}接口类型名:自定义,一般会在后面添加er,表明接口类型方法名首字母和接口类型名首字母都大写时,该方法可以被其他包访问参数列表和返回值列表中可以省略变量名,只保留类型名实现接口其它类型只要实现了一个接口的
2020-08-04 21:22:01 436 1
原创 golang基础小记(15)——方法(Method)
方法方法(Method)就是一类带特殊的接收者(Receiver)参数的函数。其与函数的区别在于,函数不属于任何类型,方法属于特定的类型。定义格式:func (接收者变量 接收者类型) 方法名(参数) 返回值 { 函数体}示例:type myInt int// 给myInt类型添加方法,判断值是否大于5func (i myInt) biggerThanFive() bool { if i > 5 { return true } return false}func
2020-07-30 17:27:01 213
原创 golang基础小记(14)——结构体:定义、初始化、构造函数、匿名字段、嵌套结构体、JSON序列化与反序列化
结构体定义Go语言没有类的概念,但是可以通过结构体实现面向对象编程。结构体是一种自定义数据类型,其可以封装任何类型。示例:type house struct { size, price float64 style string}上例house是自定义结构体类型,包括size、price、style三个字段,可以用来描述房子的面积、价格和风格。house类型的变量可以很方便的存储房子信息。结构体实例化结构体是值类型,需要声明后才能使用,声明后内部成员的值默认是对应成员类型的零值。基本实
2020-07-29 20:13:11 4875
原创 golang基础小记(13)——自定义类型和类型别名(type)
自定义类型Go语言通过type关键字定义自定义类型。自定义类型是全新的类型。示例:// 将newInt定义为int类型type newInt intfunc main() { var a newInt a = 100 fmt.Println(a) // 100 fmt.Printf("%T\n", a) // main.newInt}上例中的newInt是具有int特性的新类型。可以看到变量a的类型是main.newInt,这表示main包下定义的newInt类型。
2020-07-29 09:49:04 668
原创 golang基础小记(12)——defer
defer语句Go语言中的defer语句会将其后面跟随的函数推迟到外层函数返回之后执行。推迟调用的函数其参数会立即求值,但直到外层函数返回前该函数都不会被调用。推迟的函数调用会被压入一个栈中,当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。defer语句后面只能跟函数调用。示例:a := 1b := 2defer fmt.Println(1, a + b) // 推迟的函数参数会立即赋值,后续改变参数值不会影响结果defer func() { // 该函数没有参数,如果函数内部使用了外
2020-07-26 16:18:12 208
原创 golang基础小记(11)——函数基础、高阶函数、匿名函数、闭包、内置函数简介
函数基础语法格式:func 函数名(参数)(返回值) { 函数体}参数参数由参数变量和对应类型组成,多个参数用,分隔。Go语言中函数没有默认参数类型简写:当连续两个或多个函数的参数类型相同时,除最后一个类型以外,其它都可以省略。比如参数x int, y int可以写成x, y int。可变参数:当参数数量不固定时,可以通过在参数名后加...来标识可变参数。可变参数在函数中通过切片来实现。可变参数必须放在固定参数的后面。示例如下:func sum2(x ...int) int {
2020-07-25 16:30:07 167
原创 golang基础小记(10)——map
map基本概念语法:map[keyType]valueType用于存储键值对(key-value),键具有唯一性内部的键值对之间是无序的,和存入的顺序无关引用类型,声明后值为nil,此时无法添加键值对,需要先使用make()来分配内存(使用方式见基础小记(9))获取长度,即键值对个数:len(map)切片的元素类型可以是map,如[]map[string]string。此时要注意每个元素都需要用make()初始化map的值可以是切片,如map[string][]string添加键值对
2020-07-25 12:07:35 226
原创 golang基础小记(9)——指针、new和make
指针Go语言中的指针不能进行偏移和运算,没有内存泄漏的风险。&:取地址操作符,取出变量的地址*:取值操作符,取出指针指向的值b := &a:
2020-07-24 21:38:37 519
原创 golang基础小记(8)——切片:make()函数构造、append()添加元素、copy()复制切片、删除元素
make()函数构造make()函数能动态的构造切片,控制新切片的长度和容量,格式如下:s := make([]T, len, cap)
2020-07-23 19:52:19 3137
原创 golang基础小记(7)——切片:初始化、基础概念
切片(slice)切片(Slice)是一个拥有相同类型元素的可变长度的序列。切片是引用类型,本身并不存储任何数据,其内部包括地址、长度、容量,其底层是数组,所以地址指向底层数组的对应元素。另外,长度是切片的元素个数,容量是长度的最大值,超过则需要扩容。切片长度和容量可以通过内置的len()函数和cap()函数获得。var s = []int{1, 2, 3}fmt.Println("长度:", len(s), "容量:", cap(s)) // 长度: 3 容量: 3初始化直接声明直接声明得
2020-06-21 11:18:02 3697
原创 golang基础小记(6)——数组:定义、初始化、遍历
Array数组定义数组是同一种数据类型元素的集合。 在Go语言中,数组声明时必须指定元素类型和长度。使用时只可以修改元素值,不可修改长度。不同长度或元素类型的数组属于不同的类型。var a1 [3]bool // 定义了元素类型是bool,长度为3的数组var a2 [4]bool// 输出数组类型,可见数组类型由元素类型和长度共同决定fmt.Printf("%T %T", a1, a2) // [3]bool [4]bool一维数组初始化直接声明可以将元素默认初始化为对应类型的零值。
2020-06-16 16:07:57 724
对抗生成网络(gan, wgan)二次元头像训练集
2020-12-12
UnityDownloadAssistant-2019.4.11f1+unity hub-4.2.1安装包
2020-10-05
合并所有csv文件的python代码.zip
2019-09-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人