Unity笔记
前面的有些关于GameObject没记我会一点点腾挪进来
Time
时间缩放比例
//时间停止
Time.timeScale = 0;
//恢复正常
Time.timeScale = 1;
//2倍速
Time.timeScale = 2;
帧间隔时间
//帧间隔时间主要是拿来计算位移的
//根据需求 选择参与计算的间隔时间
//希望游戏暂停时不动就用deltaTime
//希望游戏暂停时动的用unscaledDeltaTime
//受Scale影响
Time.deltaTime
//不受Scale影响
Time.unscaledDeltaTime
游戏开始到现在的时间
//作用单机游戏中计时
//受Scale影响的时间
Time.time
//不受scale影响
Time.unscaleTime
物理帧间隔时间 FixedUpdate
//受scale影响
Time.fixedDeltaTime
//不受scale影响
Time.fixedUnscaledDeltaTime
帧数
//从开始到现在跑了多少帧
Time.frameCount
总结
Time相关的内容最常用的是帧间隔时间(计算位移),时间缩放比例(暂停,倍速), 帧数(帧同步)
Transform
vector3
// 主要是用来表示三位坐标系中的一个点 或者一个向量
//申明
Vector3 v = new Vector3();//无参构造
v.x = 10;
v.y = 10;
v.z = 10;
//只传x,y默认z =10
Vector3 v2 = new Vector3(10, 10);
//一步到位
Vector3 v3 = new Vector3(10,10,10);
//结构体可以不用new
Vector3 v4;
Vector3基本运算
// + - * / 就是对应的xyz都运算
Vector3 v1 = new Vector3(1, 1, 1);
Vector3 v12 = new Vector3(2, 2, 2);
v1 + v12 = (3, 3, 3);
//常用的
Vector3.zero // 000
Vector3.right // 100;
Vector3.left // -100;
Vector3.forward // 001;
Vector3.back // 00-1
Vector3.up // 010
Vector3.down // 0-10
//计算距离的方法
Vector3.Distance(v1, v12);
位置
//世界坐标系(物体如果有父对象的话可能和面板不一样)
this.gameObject.transform.position
//相对父对象
this.transform.localPosition
//注意 位置的赋值不能直接改变x, y, z只能整体改变
this.transform.position.x = 10;//这个写法是错误的,会报错
正确写法只能:
this.tansform.position = new Vector3(10, 10, 10);
this.transform.localPosition = Vector3.up * 10;
//如果想要只改一个值:
//直接赋值 this.transform.position = new Vector3(10, this.transform.position.y,this.transform.position.z);
//虽然不能直接改transform的xyz但是可以改Vector3的xyz
//可以先取出来改Vector3再赋值
Vector3 vPos = this.transorm.localPosition;
vPos.x = 10;
this.transform.localPosition = vPos;
//对象当前的各朝向
this.transform.forward
this.transform.up
this.transform.right
…
//位移
位移 = 方向 * 速率 * 时间
//方式一 自己计算
//变化position
this.transform.position += this.transform.forward * v * Time.deltaTime;
//方式二 API
//参数一 位移多少
//参数二 相对坐标系 (坐标系中找向量)
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime)//不写第二个参数默认local的方向
this.transform.Translate(Vector3.forward * Time.deltaTime * speed, Space.World);//世界
this.transform.Translate(this.transform.forward * Time.deltaTime * speed, Space.World);//
角度和旋转
角度
//相对世界坐标角度:
this.transform.eulerAngles
//相对父对象的角度
this.transform.localEulerAngel
和位置差不多
旋转
//自转
和位置变化类似
//每个轴具体转多少度
this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime);
this.transform.Rotate(new Vector3(0, 10, 0) * Time.deltaTime, Space.World);
//相对于某个轴 转多少度
//参数一 相对哪个轴进行转动
//参数二 转动的角度是多少
//参数惨 默认不填 就是相对自己的坐标轴
填了 可以填写关于世界坐标轴进行旋转
this.transform.Rotate(Vector3.up, 10 * Time.deltaTime, Space.World);
//相对某一个点转
//参数一 相对与哪一个点
//参数二 相对于与点的哪一个轴
//参数三 转动的角度
this.transform.RotateAround(Vector3.zero, Vector3.up, 10 * Time.deltaTime);
缩放和看向
缩放
//相对世界坐标系
this.transform.lossyScale
//相对本地坐标系
this.transform.localScale
//注意 缩放不能只改xyz只能一起改 (相对于世界坐标系的缩放大小只能得不能改)
所以我们一般修改缩放大小 都是改的 相对于父对象的缩放大小 localScale
缩放没有API
想让缩放发生变化只能自己去写
看向
让一个对象面朝向 可以一直看向某一个点或者某一个对象
this.transform.lookAt(Vector3.zero);
父子关系
this.tranform.parent.name
this.transform = null;//父子关系设为空
this.transform.parent = GameObject.Find(“xxx”).transform;//设置新的父子关系
通过API设置
this.transform.SetParent(null);
this.transform.SetParent(GameObject.Find(“xxx”).transform);
//参数一 我的父亲
//参数二 是否保留世界坐标的 位置 角度 缩放 信息 true false
true 会保留 世界坐标下的状态 和父对象进行计算之后 得到本地坐标系的信息
false 不会保留 会直接把世界坐标系下的 位置角度缩放直接赋值到本地坐标系下
//抛妻弃子:断绝所有子对象的联系
this.transform.DetachChildren();
//获取子对象:
//按名字寻找
//找到儿子transform信息
//这个Find能找到失活的对象的 GameObject相关找不到 失活对象
//只能找自己的儿子而找不到孙子及以下
this.transform.Find(“xxx”);
//虽然效率比GameObject.Find()高 但是必须知道父亲是谁才能找
//遍历儿子
//得到有多少个儿子(包括失活的)
//不算孙子
this.transform.childrenCount
//通过索引号得到自己儿子
//编号超过儿子数的范围 会直接报错
this.transform.GetChild(int index);
for(int i = 0; i < this.transform.childCount; i ++)
//儿子的操作:
//判断自己的爸爸是谁
public Transform son;
son.IsChildOf(this.transform) 返回值是bool值
//得到自己作为儿子的编号
son.GetSiblingIndex()
//把自己设置成第一个儿子
son.SetAsFirstSibling();
//把自己设置成最后一个儿子
son.SetAsLastSibling();
//把自己设置为指定个儿子
//就算index 超出儿子数量 不会报错 会设置成最后一个(负数和大于数量)
son.SetSiblingIndex(int index)
坐标转换
//世界坐标转本地坐标
//世界坐标系的点 转换 本地坐标系的点
//受缩放的影响
this.transform.InverseTransnsformPosition(Vector3.forward)
//世界坐标的方向 转换 本地坐标的方向
//不受缩放影响
this.transform.InverseTransformDirection(Vector3.forward)
//受缩放影响
this.transform.InverseTransformVector(vector3.forward)
//本地坐标转世界坐标
特别重要
//本地坐标系的点 转换 世界坐标系的点
//受缩放影响
this.transform.TransformPoint(Vector3.forward)
//本地坐标系的方向 转换 世界坐标系的方向
//不受缩放影响
this.transform.TransformDirection(Vector3.forward)
//受缩放影响
this.transform.TransformVector(Vector3.forward)
input输入
鼠标键盘输入
//鼠标位置 屏幕原点在左下角 往右是x轴正方向 往上是y轴正方向
//返回值是Vector3 只有x y有值 z一直为0
Input.mousePosition
//检测鼠标输入
//0左键 1右键 2中键
//鼠标按下
Input.GetMouseButtonDown(0)
//鼠标抬起
Inpput.GetMouseButtonUp(0)
//长按按下抬起都会input
Input.GetMouseButton(0)
//中键滚动
//返回值是Vector2 中键滚动改变的是y的值
//返回值y -1下 0 1上
Input.mouseScrollDelta
//检测键盘输入
//键盘按下 (推荐使用)
Input.GetKeyDown(KeyCode.X)//X是按键
//传入字符串的重载
//这里传入的字符串不能是大写的 只能是小写的 不然会报错
Input.GetKeyDown(“q”)
//键盘抬起
Input.GetKeyUp(KeyCode.Space)
//键盘长按
Input.GetKey(KeyCode.W)
检测默认轴输入
//Unity提供了更方便的方法来帮助我们控制对象的位移和旋转
记不住可以看 Project Setting-Input Manager
//键盘AD按下时返回 -1 到 1之间的变换
//相当于 得到的这个值 就是我们左右方向 我们可以通过它来控制 对象左右移动 或左右旋转
Input.GetAxis(“Horizontal”)
//键盘SW按下时返回 -1 到 1之间的变换
//相当于 得到的这个值 就是我们左右方向 我们可以通过它来控制 对象上下移动 或上下旋转
Input.GetAxis(“Vertical”)
//鼠标横向移动时 -1 到 1 左 右
Input.GetAxis(“Mouse X”)
//鼠标竖向移动时 -1 到 1 下 上
Input.GetAxis(“Mouse Y”)
//GetAxis是有渐变的会出现-101间的小数
//GetAxisRaw方法 和 GetAxis方法一样
//但是 返回值只有-1 0 1不会有中间值
其它类输入
//是否有任意键或鼠标 长按
Input.anyKey
//是否有任意键或鼠标 按下
Input.anyKeyDown
//这一帧的键盘输入
Input.inputString
手柄输入
//得到连接的手柄的所有按钮名字
string[] strs = Input.GetJoystickNames();
//某一个手柄键按下
if(Input.GetButtonDown(“Jump”))…
//某一个手柄键抬起
if(Input.GetButtonUp(“Jump”))…
//某一个手柄键长按
if(Input.GetButton(“Jump”))…
移动设备输入
//移动设备触摸相关
if(Input.touchCount > 0)
{
Touch t1 = Input.touches[0];
//位置
t1.position
相对上次位置的变化
t1.deltaPosition
}
//是否启用多点触控
Input.multiTouchEnabled = false/true
陀螺仪(重力感应)
//是否开启陀螺仪 必须开启 才能正常使用
Input.gyro.enabled = true;
//重力加速度向量
Input.gyro.gravity
//旋转速度
Input.gyro.rotationRate
// 陀螺仪 当前的旋转四元数
//比如 用这个信息来控制 场景上一个3D物体受重力影响
//手机怎么动 它怎么动
Input.gyro.attitude
总结
必须记住鼠标键盘相关的输入相关API GetAxis
剩下的有需求了再了解
Screen屏幕相关
静态属性
常用:
//获取当前屏幕分辨率(设备)
Resolution r = Screen.CurrentResolution;//Resolution类有宽高和刷新率
print(r.height + “ “ + r.width);//打印宽高
//屏幕窗口当前宽高(窗口)
Screen.width
Screen.height
//屏幕休眠模式
Screen.sleepTimeout = SleepTimeout.NeverSleep;
Screen.sleepTimeout = SleepTimeout.SystemSetting;
不常用
//运行时是否全屏模式
Screen.fullScreen = ture;
//窗口模式
发布时能设置 只有有特殊需求才用代码设置
//独占全屏FullScreenMode.ExclusiveFullScreen
//全屏窗口FullScreenMode.FullScreenWindow
//最大化窗口FullScreenMode.MaximizedWindow
//窗口模式FullScreenMode.Windowed
Screen.fullScreenMode = FullScreenMode.ExclusiveFullScreen
Screen.fullScreenMode = FullScreenMode.FullScreenWindow
Screen.fullScreenMode = FullScreenMode.MaximizedWindow
Screen.fullScreenMode = FullScreenMode.Windowed
//移动设备屏幕转向相关
//发布时能设置 只有有特殊需求才用代码设置
//允许自动旋转为左横向 Home键在左
Screen.autorotateToLandscapeLeft = true;
//允许自动旋转为右横向 Home键在右
Screen.autorotateToLandscapeRight = true;
//允许自动旋转到纵向 Home键在下
Screen.autorotateToPortrait = true;
//允许自动旋转到纵向倒着看 Home键在上
Screen.autorotateToPortraitUpsideDown = true;
//指定屏幕显示方向
Screen.orientation = ScreenOrientation.Landscape(横屏)
静态方法
//设置分辨率 一遍移动设备不用
第三个参数 是否全屏
Screen.SetResolution(1920, 1080, false);
Camera
![[QQ_1775800913161.png|126]]
以上标红的参数都比较重要
代码相关
//重要静态成员
//获取摄像机
//主摄像机
//如果想要通过这个方式快速获取谁相机 场景上一定要打MainCamera的tag
Camera.main
//获取摄像机的数量
Camera.allCameraCount
//得到所有摄像机
Camera[] = allCamera = Camera.allCameras;
//渲染委托相关
//摄像机剔除前处理的委托函数
Camera.onPreCull += (c) =>
{
xxx
};
//摄像机渲染前处理的委托
Camera.onPreRender += (c) =>
{
};
//摄像机渲染后处理的委托
Camera.onPostRender += (c) =>{
};
//重要成员
//摄像机界面上的参数都可以在Camera中获取到
下面这句能得到主摄像机上的深度并设置
Camera.main.depth = 10;
//世界坐标转屏幕坐标
//转换过后x y就是屏幕坐标 z是物体离摄像机有多远
//可以用来写血条功能
Camera.main.WorldToScreenPoint(Vector3 Position)
//屏幕坐标转世界坐标
Camera.main.ScreenToWorldPoint(Input.mousePosition)
光源系统
public Light light;
//一般是拿代码控制面板的数值
//几乎没有静态方法
物理系统之碰撞检测
//碰撞产生的必要条件是两个物体都有碰撞器 至少一个物体有刚体
连续动态 > 连续推测 > 连续检测 > 离散检测
物理材质参数
Dynamic Friction 移动时使用的摩擦力
Static Friction 静止时使用的摩擦力
通常为0-1之间的值
越趋近于0 摩擦力越小 越趋近于1 摩擦力越大
Bounciness
表面弹性
值为0将不会反弹 值为1将在反弹时不会产生任何能量损失
xxx combine 数值的计算方式 平均值 最大最小值 相乘
碰撞检测函数
注意:碰撞和触发响应 属于 特殊的生命周期函数 也是通过反射调用
物理碰撞检测相应函数
Collision类型包含了碰到自己的对象的相关信息
关键参数
1.碰撞到的对象碰撞信息
collision.collider
2.碰撞对象的依附对象(GameObject)
collision.gameObject
3.碰撞对象的依附对象的位置信息
collision.transform
4.触碰点数相关
collision.contactCount
接触点具体坐标
ContactPoint[] pos = collision.contacts
只要得到了碰撞到的对象的一个信息就可以得到它所有的信息
碰撞触发时会 自动执行的函数
private void OnCollisionEnter(Collision collision)
{
}
碰撞结束分离式 自动执行的函数
private void OnCollisionExit(Collision collision)
{
}
两个物体相互摩擦接触时 会不停的调用函数
private void OnCollisionStay(Collision collision)
{
}
触发器碰撞检测函数
触发开始的函数
private void OnTriggerEnter(Collider other)
{
}
触发结束的函数
private void OnTriggerExit(Collider other)
{
}
触发持续时 一直不停调用的函数
private void OnTriggerStay(Collider other)
{
}
不用考虑物体上是否拥有刚体 只要脚本挂载的物体能和别的物体碰撞或触发 那么以上六个函数都能响应
如果一个异形物体 刚体在父对象上 子对象上的脚本检测是不行的 必须挂载到父对象上才行
碰撞和触发器函数都能写成虚函数 在子类中重写
想要重写的 可以写成保护类型的 默认是private
一般不会使用public 因为不会手动调用 都是Unity反射自动调用
刚体加力:
加力之后 对象是否停止移动是由阻力决定的
如果阻力为零 那么对象不会停止运动
如果你希望有阻力但是也不会停止 可以试着Update里面给力
世界坐标
向世界Z轴方向添加一个力
rigidBody.AddForce(Vector3.forward * 10);
向本地朝向添加力 理解类似位移
rigidBody.AddForce(this.transform.forward * 10);
本地坐标
rigidBody.AddRelativeForce(Vector3.forward * 10);
添加扭矩力
rigidBody.AddTorque(Vector3.forward * 10);
直接改变速度
rigidBody.velocity = Vector3.forward * 10;
模拟爆炸效果
第一个参数 力的大小
第二个参数 爆炸中心
第三个参数 爆炸半径
rigidBody.AddExplosionForce(10, Vector3.zero, 10);
力的几种模式
v = Ft / m
第二个参数 力的模式 主要作用 就是 计算方式不同而已
rigidBody.AddForce(Vector3.forward * 10, ForceMode.xxx)
Acceleration
给物体一个持续的加速度 忽略其质量
Force
给物体一个持续的力 与质量有关
Impulse
给物体一个瞬时的力,与物体的质量有关 忽略时间 默认为1
VelocityChange
给物体一个瞬时速度 忽略质量
补充 刚体的休眠
在一定情况下 刚体会进入休眠 不参与计算 就会出bug
如果不想让刚体休眠
if( rigidBody.IsSleeping ){
rigidBody.WakeUp();
}


