当前位置: 首页 > news >正文

unity基础学习笔记<上>

3D数学中 Math和Mathf区别:

Math是C#自带工具提供数学相关计算方法
Mathf是Unity封装的工具类结构,不仅包含了Math里的方法,还多了一些适用于游戏开发的方法。
所以我们使用Mathf再开发中使用。

常用的Mathf:

Mathf.PI;//3.1415927
Mathf.Abs(-11);//绝对值
print(Mathf.CeilToInt(-11);//向上取整
print(Mathf.FloorToInt(-11);//向下取整
//钳制函数(第一个设置参数,第二个最小数,第三个最大数)设置参数靠近那个数显示那个数,在中间则打印中间数
Mathf.Clamp(10, 11, 12);
Mathf.Max(1,2,3);//最大数
Mathf.Min(1,2,3);//最小数
Mathf.Pow(4,2);//n次幂
Mathf.RoundToInt(1.1f);//四舍五入
Mathf.Sqrt(4);//平方根
Mathf.IsPowerOfTwo(4);//判断是否为2的n次方
Mathf.Sign(4);//判断正负数,正数打印1,负数打印-1

插值运算

永远不等于最终值
start= Mathf.Lerp(start, 10, Time.deltaTime);
当t>=1时。得到最终值。
time += Time.deltaTime;
start = Mathf.Lerp(start, 10, time);
3D数学中弧度和角度的转换
弧度转角度
float rad = 1.0f;
float anger = radMathf.Rad2Deg;
print(anger);
角度转弧度
anger = 1;
rad = anger
Mathf.Deg2Rad;
print(rad);

三角函数

Mathf中相关的三角函数传入的参数是弧度值
print(Mathf.Sin(30 * Mathf.Deg2Rad));//30
print (Mathf.Cos(60 * Mathf.Deg2Rad));//30
反三角函数
反三角函数得到的结果是正弦或者余弦值对应的弧度
rad = Mathf.Asin(0.5f);
print(radMathf.Rad2Deg);
rad = Mathf.Acos(0.5f);
print (rad
Mathf.Deg2Rad);

unity中坐标以及坐标的相互转换

世界坐标系:修改他们 会是相对世界坐标系的变化
this.transform.position;
this.transform.rotation;
this.transform.eulerAngles;
this.transform.lossyScale;
物体坐标系:相对父对象的物体坐标系的位置 本地坐标 相对坐标。。修改他们 会是相对父对象物体坐标系的变化
this.transform.localPosition;
this.transform.localEulerAngles;
this.transform.localRotation;
this.transform.localScale;
屏幕坐标系
Input.mousePosition
Screen.width;
Screen.height;
视口坐标系:摄像机上的 视口范围

坐标转换相关

世界转本地
this.transform.InverseTransformDirection
this.transform.InverseTransformPoint
this.transform.InverseTransformVector
本地转世界
this.transform.TransformDirection
this.transform.TransformPoint
this.transform.TransformVector
世界转屏幕
Camera.main.WorldToScreenPoint
屏幕转世界
Camera.main.ScreenToWorldPoint
世界转视口
Camera.main.WorldToViewportPoint
视口转世界
Camera.main.ViewportToWorldPoint
视口转屏幕
Camera.main.ViewportToScreenPoint
屏幕转视口
Camera.main.ScreenToViewportPoint;

3D数学–向量

1.向量: 标量(有数值没方向);向量:有数值有方向(一维二维三维)
三维向量Vector3 (向量:位置判断,方向移动)
位置:代表一个点this.transform.position
方向:代表一个方向this.transform.forward
2,两点决定一向量:终点减去起点(a到b = b-a(的坐标)就是向量)
A和B两个点Vector3 A = new Vector3(1,2,3);Vector3 B = new Vector3(1,3,3);
求AB和BA的向量Vector3 AB= B - A;Vector3 BA = A - B;
3.零向量和负向量
零向量:唯一一个大小为0的向量;Vector3.zero
向量(x,y,z)的负向量为(-x,-y,-z)
负向量和原向量大小相等方向相反Vector3.forward -Vector3.forward
4.向量模长 magnitude
向量的模长就是向量的长度。模长公式:a向量(x,y,z)。。模长=根号 x平方+y平方+z平方)
AB.magnitude);//距离
Vector3.Distance(A, B);//距离
BA.magnitude;//距离
5,单位向量normalized
单位向量:模长为1的向量为 单位向量。任何一个向量经过归一化后变成单位向量:只需要方向,不需要模长影响计算结果时使用单位向量
归一化公式:A向量(x,y,z)
模长:模长=根号 x平方+y平方+z平方
单位向量:(x/模长,y/模长,z/模长)
AB.normalized;
AB/AB.magnitude;

6,向量加减乘除

向量加法:用于位置平移和向量计算
向量乘除标量:模长放大缩小
向量加法:用于位置平移和向量计算
位置和向量相加等于平移
this.transform.Translate(Vector3.forward * 5);
向量减法:用于位置平移和向量计算
位置-位置=向量(两点决定一向量(终点-起点))
向量-向量=向量(向量相减:头连头尾连尾)(A-B=B指向A)
位置-向量=位置 位置减向量等于位置平移
向量乘除标量:模长放大缩小
向量只和标量相乘除
几何意义:向量或/标量=向量;向量0=0
向量或/正数=方向不变,放大缩小模长;
向量
或/负数=方向相反,放大缩小模长
7,点乘的计算公式:Dot
向量乘向量等于标量:A(xa,ya,za)B(xb,yb,zb) A·B = XaXb + YaYb + Za*Zb;
点乘的几何意义:点成可以得到一个向量,在自己向量上投影长度。
点乘结果:result>0 两向量夹角锐角result=0 两向量夹角直角result<0 两向量夹角钝角
用于判断敌人的方向的一种计算。
AB单位向量的夹角=Acos(单位向量A.单位向量B)。
通过点乘判断对象方位
Vector3 提供了计算点乘的方法
Debug.DrawRay(this.transform.position, this.transform.forward, Color.red);
Debug.DrawRay(this.transform.position, target.position - this.transform.position, Color.red);
得到两个向量的点乘结果 向量 a 点乘 AB 的结果

调试画线

//画线段 前两个参数:起点和终点
Debug.DrawLine(this.transform.position, this.transform.position+this.transform.forward,Color.red);
//画射线 前两个参数:起点和方向
Debug.DrawLine(this.transform.position, this.transform.forward, Color.white);
向量-叉乘计算(a坐标和b坐标)
print(Vector3.Cross(A.position, B.position));
叉乘几何意义
//假设向量 A和B 都在 XZ平面上
//向量A 叉乘 向量 B
//y大于0 证明 B在A右侧
//y小于0 证明 B在A左侧
Vector3 C = Vector3.Cross(B.position, A.position);
if (C.y > 0)
{print(“A在B的右侧”);}
else{print(“A在B的左侧”);}
线性插值
//result = start+(end-start)*t
//1,先快后慢。每帧改变start位置,位置无限接近但不会得到end位置
A.position = Vector3.Lerp(A.position, target.position, Time.deltaTime);
//2,匀速。每帧改变时间,当t=>0时,得到结
time += Time.deltaTime;
B.position = Vector3.Lerp(startPos, nowTarget, time);
球形插值//有一点点高度会出现弧度。
C.position = Vector3.Slerp(Vector3.right * 10, Vector3.left * 10 + Vector3.up * 0.1f, time * 0.01f)

四元数

四元数Q = [cos(β/2), sin(β/2)x, sin(β/2)y, sin(β/2)z]
计算原理
Quaternion q=Quaternion(Mathf.Sin(30Mathf.Deg2Rad),0.0,Mathf.Cos(30Mathf.Deg2Rad));
提供的轴对角 初始化四元数的方法
Quaternion q1 = Quaternion.AngleAxis(60, Vector3.right);

四元数和欧拉角转换

//欧拉角转四元数
Quaternion q2 = Quaternion.Euler(60,0,0);
//四元数转欧拉角
print(q2.eulerAngles);
四元数弥补的欧拉角旋转
1.同一旋转的表示不唯一 四元数旋转后 转换后的欧拉角 始终是 -180~180度
2.万向节死锁 通过四元数旋转对象可以避免万向节死锁

单位四元数

print(Quaternion.identity);
Instantiate(testObj,Vector3.zero, Quaternion.identity);

插值运算

start = B.transform.rotation;
//无限接近,先快后慢
A.transform.rotation = Quaternion.Slerp(A.transform.rotation,target.rotation,Time.deltaTime);
//匀速变化 time=>1到达目的
time = Time.deltaTime;
B.transform.rotation = Quaternion.Slerp(start, target.rotation, time);
LookRotation
Quaternion q = Quaternion.LookRotation(lookA.position, lookB.position);
lookA.rotation = q;

四元数相乘:角度叠加
//API初始化
Quaternion q = Quaternion.AngleAxis(20, Vector3.up);
this.transform.rotation *= q;
this.transform.rotation *= q;

四元数乘向量:旋转向量

Vector3 v=Vector3.forward;
v = Quaternion.AngleAxis(45, Vector3.up) * v;

延时函数

Invoke 延时函数: 参数一:函数名 字符串 参数二:延迟时间 秒为单位 例子: Invoke(“DelayDoSomething”, 1);
InvokeRepeating 延时重复函数 参数一:函数名字符串 参数二:第一次执行的延迟时间 参数三:之后每次执行的间隔时间 例子:InvokeRepeating(“DelayRe”, 5, 1);
CancelInvoke 停止所有或者指定延时函数
IsInvoking 判断是否有延时函数待执行
使用相关
1.参数都是函数名,无法传参数
2.只能执行该脚本中申明的函数
3.对象或脚本失活无法停止延时函数执行,只有销毁组件或者对象才会停止或者代码停止

多线程

Unity是否支持多线程?
首先要明确一点Unity是支持多线程的。只是新开线程无法访问Unity相关对象的内容
注意:Unity中的多线程 要记住关闭
协同程序简称协程,它是“假”的多线程,它不是多线程
它的主要作用:将代码分时执行,不卡主线程。简单理解,是把可能会让主线程卡顿的耗时的逻辑分时分步执行
主要使用场景:异步加载文件,异步下载文件,场景异步加载,批量创建时防止卡顿。,
协同程序和线程的区别
线程:新开一个线程是独立的一个管道,和主线程并行执行
协程:新开一个协程是在原线程之上开启,进行逻辑分时分步执行
协程的使用
继承MonoBehavior的类 都可以开启 协程函数
第一步:申明协程函数
协程函数2个关键点
1-1返回值为IEnumerator类型及其子类
1-2函数中通过 yield return 返回值; 进行返回
第二步:开启协程函数
协程函数 是不能够 直接这样去执行的!!!!!!!
这样执行没有任何效果
MyCoroutine(1, “123”);
常用开启方式
//IEnumerator ie = MyCoroutine(1, “123”);
第三步:关闭协程
关闭所有协程
StopAllCoroutines();
关闭指定协程
StopCoroutine(c1);

yield return 不同内容的含义

1.下一帧执行
yield return 数字;
yield return null;
在Update和LateUpdate之间执行
2.等待指定秒后执行
yield return new WaitForSeconds(秒);
在Update和LateUpdate之间执行
3.等待下一个固定物理帧更新时执行
yield return new WaitForFixedUpdate();
在FixedUpdate和碰撞检测相关函数之后执行
4.等待摄像机和GUI渲染完成后执行
yield return new WaitForEndOfFrame();
在LateUpdate之后的渲染相关处理完毕后之后
5.一些特殊类型的对象 比如异步加载相关函数返回的对象
之后讲解 异步加载资源 异步加载场景 网络加载时再讲解
一般在Update和LateUpdate之间执行
6.跳出协程
//yield break;
协程受对象和组件失活销毁的影响
协程开启后,组件和物体销毁,协程不执行;物体失活协程不执行,组件失活协程执行;
关键点一: 协同程序(协程)函数 返回值 必须是 IEnumerator或者继承它的类型
关键点二: 协程函数当中 必须使用 yield return 进行返回
yield return null;
//主要会用来 截图时 会使用
yield return new WaitForEndOfFrame();
协程的本质
协程可以分成两部分1.协程函数本体2.协程调度器
协程本体就是一个能够中间暂停返回的函数
协程调度器是Unity内部实现的,会在对应的时机帮助我们继续执行协程函数
Unity只实现了协程调度部分
协程的本体本质上就是一个 C#的迭代器方法
协程本体是迭代器方法的体现
1.协程函数本体
//如果我们不通过 开启协程方法执行协程
//Unity的协程调度器是不会帮助我们管理协程函数的
IEnumerator ie = Test();
2.协程调度器
//继承MonoBehavior后 开启协程
//相当于是把一个协程函数(迭代器)放入Unity的协程调度器中帮助我们管理进行执行
//具体的yield return 后面的规则 也是Unity定义的一些规则

资源加载

Resources 资源文件夹…需要我们自己将创建
print(Application.dataPath + “/Resources”);
StreamingAssets 流动资源文件夹
路径获取:需要我们自己将创建
print(Application.streamingAssetsPath);
persistentDataPath 持久数据文件夹.不需要我们自己将创建
路径获取:print(Application.persistentDataPath);
Plugins 插件文件夹要我们自己将创建
作用:插件文件夹。不同平台的插件相关文件放在其中,比如IOS和Android平台
Editor 编辑器文件夹需要我们自己将创建
print(Application.dataPath + “/Editor”);
作用:编辑器文件夹
Standard Assets需要我们自己将创建
作用:默认资源文件夹
一般Unity自带资源都放在这个文件夹下代码和资源优先被编译

资源同步加载

Resources资源动态加载的作用
1.通过代码动态加载Resources文件夹下指定路径资源
2.避免繁琐的拖曳操作
常用资源类型
预设体对象——GameObject
音效文件——AudioClip
文本文件——TextAsset
图片文件——Texture
1.预设体对象 想要创建在场景上 记住实例化
第一步:要去加载预设体的资源文件
Object obj = Resources.Load(“Cube”);
第二步:如果想要在场景上 创建预设体 一定是加载配置文件过后 然后实例化
Instantiate(obj);
2.音效资源
第一步:就是加载数据
Object obj3 = Resources.Load(“Music/BKMusic”);
第二步:使用数据 我们不需要实例化 音效切片 我们只需要把数据 赋值到正确的脚本上即可
audioS.clip = obj3 as AudioClip;
audioS.Play();
3.文本资源
文本资源支持的格式.txt。.xml。.bytes。.json。.html。.csv
4问题:资源同名怎么办
Resources.Load加载同名资源时 无法准确加载出你想要的内容
可以使用另外的API
资源同步加载 泛型方法

资源异步加载

Resources异步加载是什么?
如果我们加载过大的资源可能会造成程序卡顿。卡顿的原因就是 从硬盘上把数据读取到内存中 是需要进行计算的。越大的资源耗时越长,就会造成掉帧卡顿
Resources异步加载 就是内部新开一个线程进行资源加载 不会造成主线程卡顿
Resources异步加载方法
注意:异步加载 不能马上得到加载的资源 至少要等一帧
1.通过异步加载中的完成事件监听 使用加载的资源
ResourceRequest rq = Resources.LoadAsync(“Tex/TestJPG”);
rq.completed += LoadOver;print(Time.frameCount);
2.通过协程 使用加载的资源
StartCoroutine(Load());
IEnumerator Load()

资源卸载

Resources.UnloadAsset 卸载指定资源 但是不能卸载GameObject对象
Resources.UnloadUnusedAssets 卸载未使用资源 一般过场景时配合GC使用
如何手动释放掉缓存中的资源
1.卸载指定资源
Resources.UnloadAsset 方法
GameObject obj = Resources.Load(“Cube”);
Resources.UnloadAsset(obj);
2.卸载未使用的资源
Resources.UnloadUnusedAssets();
GC.Collect();

场景加载

场景异步加载:
场景同步切换:SceneManager.LoadScene(“Lesson20Test”);
场景同步切换的缺点
在切换场景时,Unity会删除当前场景上所有对象,并且去加载下一个场景的相关信息。如果当前场景 对象过多或者下一个场景对象过多,这个过程会非常的耗时 会让玩家感受到卡顿。所以异步切换就是来解决该问题的
场景异步切换
场景异步加载和资源异步加载 几乎一致 有两种方式
1.通过事件回调函数 异步加载
AsyncOperation ao = SceneManager.LoadSceneAsync(“Lesson20Test”);
ao.completed += (a) =>{print(“加载结束”);};
ao.completed += LoadOver;
2.通过协程异步加载
DontDestroyOnLoad(this.gameObject);
StartCoroutine(LoadScene(“Lesson20Test”));
场景异步加载 和 资源异步加载 一样
他们的优缺点表现和资源异步加载 也是一样的
1.事件回调函数
优点:写法简单,逻辑清晰
缺点:只能加载完场景做一些事情 不能再加载过程中处理逻辑
2.协程异步加载
优点:可以在加载过程中处理逻辑,比如进度条更新等
缺点:写法较为麻烦,要通过协程
ResourceRequest 的主要属性
asset: 加载完成的资源对象
isDone: 是否加载完成(布尔值)
progress: 加载进度(0.0 到 1.0)

http://www.dtcms.com/a/511421.html

相关文章:

  • C# WPF Dragablz使用记录 TabControl选项卡可拖拽为单独界面或停靠
  • 机器人场景落地步入技术验证阶段,微美全息加快创新势能探索AI多元路径变革
  • YOLOv4 核心内容笔记
  • 网站开发工程师待遇家庭网站建设
  • 医疗门户网站模板wordpress3.8
  • iOS的多线程下数据安全和内存泄漏以及工具使用监测内存泄漏
  • 『CMake』关于使用CMake构建项目时的现代/传统指令
  • 请被人做网站怎么做倒计时网站
  • App开发框架调研对比
  • Ubuntu下载以及安装详解以及应用安装
  • 亚马逊云代理:AWS的EC2, S3, RDS,Lambda具体简介
  • 2640. QYQ在艾泽拉斯
  • 基于 React + TypeScript + Fabric.js 构建一个封面生成器网站
  • 营销型电子商务网站品牌建设与推广思路
  • 更新网站 seo公司的管理方式与管理方法
  • BZV49-C22,115稳压二极管 NXP安世半导体 工业电源芯片 芯片解析
  • 职场发展—如何避雷垃圾公司
  • 【Linux篇】软链接vs硬链接:Linux文件系统中的两种引用机制
  • C++ list核心接口与实战技巧
  • 微服务框架
  • 网站模块结构图wordpress调用栏目名称
  • 算法学习记录03——二叉树学习笔记:从两道题看透后序位置的关键作用​
  • Rust高性能分布式任务调度系统开发实践:从设计到性能优化
  • go tools安装
  • 阿里云代理商:如何给阿里云配置网络ACL?
  • 阿里巴巴 Java 开发手册解读:DO、DTO、BO、AO、VO、Query 的区别与用法
  • 接口测试如何做
  • 记录日常日志
  • 【LeetCode_876_2.02】快慢指针在链表中的简单应用
  • LOOP套LOOP,双LOOP优化,效率提升近30倍