Unity入门4——重要组件与API
一、GameObject
(一)成员变量
// 名字
print(this.gameObject.name);
this.gameObject.name = "Lesson4唐老狮改名";
print(this.gameObject.name);// 是否激活
print(this.gameObject.activeSelf);// 是否是静态
print(this.gameObject.isStatic);// 层级
print(this.gameObject.layer);// 标签
print(this.gameObject.tag);// transform
// this.transform 上一节课讲解的 通过Mono去得到的依附对象的GameObject的位置信息
// 他们得到的信息是一样 都是依附的GameObject的位置信息
print(this.gameObject.transform.position);
(二)静态方法
-
创建自带几何体
只要得到了一个 GameObject 对象,就可以得到它身上挂在的任何脚本信息通过 obj.GetComponent 来获得
-
查找对象
两种找单个对象的共同点:
- 无法找到失活的对象的,只能找到激活的对象
- 如果场景中存在多个满足条件的对象,我们无法准确确定找到的是谁
// 1.查找单个对象
// 通过对象名查找
// 这个查找效率比较低下 因为他会在场景中的所有对象去查找
// 没有找到 就会返回null
GameObject obj2 = GameObject.Find("唐老狮");
if( obj2 != null ) print(obj2.name);
else print("没有找到对应对象");// 通过tag来查找对象
// GameObject obj3 = GameObject.FindWithTag("Player");
// 该方法和上面这个方法 效果一样 只是名字不一样而已
GameObject obj3 = GameObject.FindGameObjectWithTag("Player");
if (obj3 != null) print("根据tag找的对象" + obj3.name);
else print("根据tag没有找到对应对象");
// 得到某一个单个对象 目前有2种方式
// 1.是public从外部面板拖 进行关联
// 2.通过API去找
// 2查找多个对象
// 找多个对象的API 只能是通过tag去找多个 通过名字 是没有找多个的方法的// 通过tag找到多个对象
// 它也是 只能找到 激活对象 无法找到失活对象
GameObject[] objs = GameObject.FindGameObjectsWithTag("Player");
print("找到tag为Player对象的个数" + objs.Length);
// 还有几个查找对象相关是用的比较少的方法 是GameObject父类 Object提供的方法
// 引出额外知识点 Unity中的Object和C#中的万物之父的区别
// Unity里面的Object 不是指的万物之父object
// Unity里的Object 命名空间在UnityEngine中的 Object类 也是集成万物之父的一个自定义类
// C#中的Object 命名空间是在System中的
// 它可以找到场景中挂载的某一个脚本对象
// 效率更低 上面的GameObject.Find 和通过FindWithTag找 只是遍历对象
// 这个方法 不仅要遍历对象 还要遍历对象上挂载的脚本
Lesson4 o = GameObject.FindObjectOfType<Lesson4>();
print(o.gameObject.name);
3.创建对象
// 实例化对象(克隆对象)的方法
// 实例化(克隆)对象 它的作用 是根据一个GameObject对象 创建出一个和它一模一样的对象
GameObject obj5 = GameObject.Instantiate(myObj);
// 以后学了更多知识点 就可以在这操作obj5
// 如果你继承了 MonoBehavior 其实可以不用写GameObject一样可以使用
// 因为 这个方法时Unity里面的 Object基类提供给我们的 所以可以直接用
// Instantiate(myObj);
4.删除对象
// 删除对象的方法
GameObject.Destroy(myObj2);
// 第二个参数 代表延迟几秒钟删除
GameObject.Destroy(obj5, 5);
// Destroy不仅可以删除对象 还可以删除脚本
// GameObject.Destroy(this);
// 删除对象有两种作用
// 1.是删除指定的一个游戏对象
// 2.是删除一个指定的脚本对象
// 注意:这个Destroy方法 不会马上移除对象 只是给这个对象加了一个移除标识
// 一般情况下 它会在下一帧时把这个对象移除并从内存中移除
// 如果没有特殊需求 就是一定要马上移除一个对象的话
// 建议使用上面的 Destroy方法 因为 是异步的 降低卡顿的几率
// 下面这个方法 就是立即把对象 从内存中移除了
// GameObject.DestroyImmediate(myObj);
// 如果是继承MonoBehavior的类 不用写GameObject
// Destroy(myObj2);
// DestroyImmediate(myObj);
5.过场景不移除
// 过场景不移除
// 默认情况 在切换场景时 场景中对象都会被自动删除掉
// 如果你希望某个对象 过场景不被移除
// 下面这句代码 就是不想谁过场景被移除 就传谁
// 一般都是传 依附的GameObject对象
// 比如下面这句代码的意思 就是自己依附的GameObject对象 过场景不被删除
GameObject.DontDestroyOnLoad(this.gameObject);
// 如果继承MOnoBehavior也可以直接写
// DontDestroyOnLoad(this.gameObject);
(三)成员方法
1.创建空物体
// 创建空物体
// new一个GameObject就是在创建一个空物体
GameObject obj6 = new GameObject();
GameObject obj7 = new GameObject("创建的空物体");
GameObject obj8 = new GameObject("顺便加脚本的空物体", typeof(Lesson2), typeof(Lesson1));
2.添加脚本
// 为对象添加脚本
// 继承MOnoBehavior的脚本 是不能够去new
// 如果想要动态的添加继承MonoBehavior的脚本 在某一个对象上
// 直接使用GameObject提供的方法即可
Lesson1 les1 = obj6.AddComponent(typeof(Lesson1)) as Lesson1;
// 用泛型更方便
Lesson2 les2 = obj6.AddComponent<Lesson2>();
// 通过返回值 可以得到加入的脚本信息
// 来进行一些处理// 得到脚本的成员方 和继承Mono的类得到脚本的方法 一模一样
3.标签比较
// 标签比较
// 下面两种比较的方法 是一样的
if(this.gameObject.CompareTag("Player")) print("对象的标签 是 Player");
if(this.gameObject.tag == "Player") print("对象的标签 是 Player");
4.激活失活
// 设置激活失活
// false 失活
// true 激活
obj6.SetActive(false);
obj7.SetActive(false);
obj8.SetActive(false);
5.广播
次要的成员方法了解即可,不建议使用
下面讲的方法,都不建议大家使用,效率比较低
通过广播或者发送消息的形式,让自己或者别人执行某些行为方法
// 通知自己 执行什么行为
// 命令自己 去执行这个TestFun这个函数 会在自己身上挂在的所有脚本去找这个名字的函数
// 它会去找到 自己身上所有的脚本 有这个名字的函数去执行
this.gameObject.SendMessage("TestFun");
this.gameObject.SendMessage("TestFun2", 199);
// 广播行为 让自己和自己的子对象执行
// this.gameObject.BroadcastMessage("函数名");
// 向父对象和自己发送消息 并执行
// this.gameObject.SendMessageUpwards("函数名");
二、Time
(一)时间缩放比例
// 时间停止 Time.timeScale = 0;
// 回复正常 Time.timeScale = 1;
// 2倍速 Time.timeScale = 2;
(二)帧间隔时间
// 帧间隔时间 主要是用来计算位移
// 路程 = 时间*速度
// 根据需求 选择参与计算的间隔时间
// 如果希望 游戏暂停时就不动的 那就使用deltaTime
// 如果希望 不受暂停影响 unscaledDeltaTime
// 帧间隔时间:最近的一帧 用了多长时间(秒)
// 受scale影响
print("帧间隔时间" + Time.deltaTime);
// 不受scale影响的帧间隔时间
print("不受scale影响的帧间隔时间" + Time.unscaledDeltaTime);
(三)游戏开始到现在的时间
// 它主要用来计时 单机游戏中计时
// 受scale影响
print("游戏开始到现在的时间:" + Time.time);
// 不受scale影响
print("不受scale影响的游戏开始到现在的时间:" + Time.unscaledTime);
(四)物理帧间隔时间 FixedUpdate
private void FixedUpdate()
{
// 受scale影响
print(Time.fixedDeltaTime);
// 不受scale影响
print(Time.fixedUnscaledDeltaTime);
}
(五)帧数
// 从开始到现在游戏跑了多少帧(次循环) print(Time.frameCount);
Time 相关的内容
最常用的就是
-
帧间隔时间,就用计算位移相关内容
-
时间缩放比例,用来暂停或者倍速等等
-
帧数(帧同步)
三、Transform
(一)Vector3
// 常用
print(Vector3.zero); // 0 0 0
print(Vector3.right); // 1 0 0
print(Vector3.left); // -1 0 0
print(Vector3.forward); // 0 0 1
print(Vector3.back); // 0 0 -1
print(Vector3.up); // 0 1 0
print(Vector3.down); // 0 -1 0
// 常用的一个方法
// 计算两个点之间的距离的方法
print(Vector3.Distance(v1, v2));
(二)位置
// 相对世界坐标系
// this.gameObject.transform
// 通过position得到的位置 是相对于 世界坐标系的 原点的位置
// 可能和面板上显示的 是不一样的
// 因为如果对象有父子关系 并且父对象位置 不在原点 那么 和面板上肯定就是不一样的
print(this.transform.position);
// 相对父对象
// 这两个坐标 对于我们来说 很重要 如果你想以面板坐标为准来进行位置设置
// 那一定是通过localPosition来进行设置的
print(this.transform.localPosition);
// 他们两个 可能出现是一样的情况
// 1.父对象的坐标 就是世界坐标系原点0,0,0
// 2.对象没有父对象
// 注意:位置的赋值不能直接改变x,y,z 只能整体改变
// 不能单独改 x y z某一个值
// this.transform.position.x = 10;
this.transform.position = new Vector3(10, 10, 10);
this.transform.localPosition = Vector3.up * 10;
// 如果只想改一个值x y和z要保持原有坐标一致
// 1.直接赋值
this.transform.position = new Vector3(19, this.transform.position.y, this.transform.position.z);
// 2.先取出来 再赋值
// 虽然不能直接改 transform的 xyz 但是 Vector3是可以直接改 xyz的
// 所以可以先取出来改Vector3 再重新赋值
Vector3 vPos = this.transform.localPosition;
vPos.x = 10;
this.transform.localPosition = vPos;
// 如果你想得到对象当前的 一个朝向
// 那么就是通过 trnasform. 出来的
// 对象当前的各朝向
// 对象当前的面朝向
print(this.transform.forward);
// 对象当前的头顶朝向
print(this.transform.up);
// 对象当前的右手边
print(this.transform.right);
(三)位移
// 理解坐标系下的位移计算公式
// 路程 = 方向 * 速度 * 时间// 方式一 自己计算
// 想要变化的 就是 position// 用当前的位置 + 我要动多长距离 得出最终所在的位置
// this.transform.position = this.transform.position + this.transform.up * 1 * Time.deltaTime;// 因为我用的是 this.transform.forward 所以它始终会朝向相对于自己的面朝向去动
// this.transform.position += this.transform.forward * 1 * Time.deltaTime;// 方向非常重要 因为 它决定了你的前进方向
// this.transform.position += Vector3.forward * 1 * Time.deltaTime;// 方式二 API
// 参数一:表示位移多少 路程 = 方向 * 速度 * 时间
// 参数二:表示 相对坐标系 默认 该参数 是相对于自己坐标系的// 1.相对于世界坐标系的 Z轴 动 始终是朝 世界坐标系 的 Z轴正方向移动
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);// 2.相对于世界坐标的 自己的面朝向去动 始终朝自己的面朝向移动
this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.World);// 3.相对于自己的坐标系 下的 自己的面朝向向量移动 (一定不会这样让物体移动) XXXXXXX
// this.transform.Translate(this.transform.forward * 1 * Time.deltaTime, Space.Self);// 4.相对于自己的坐标系 下的 Z轴正方向移动 始终朝自己的面朝向移动
this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.Self);// 注意:一般使用API来进行位移
(四)欧拉角度
// 相对世界坐标角度
print(this.transform.eulerAngles);// 相对父对象角度
print(this.transform.localEulerAngles);// 注意:设置角度和设置位置一样 不能单独设置xyz 要一起设置
// 如果我们希望改变的 角度 是面板上显示的内容 那一点是改变 相对父对象的角度
// this.transform.localEulerAngles = new Vector3(10, 10, 10);
// this.transform.eulerAngles = new Vector3(10, 10, 10);
print(this.transform.localEulerAngles);
(五)欧拉旋转
// 自己计算(省略不讲了 和位置一样 不停改变角度即可)
// API计算
// 自转
// 每个轴 具体转多少度
// 第一个参数 相当于 是旋转的角度 每一帧
// 第二个参数 默认不填 就是相对于自己坐标系 进行的旋转
// 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.right, 10 * Time.deltaTime);
this.transform.Rotate(Vector3.right, 10 * Time.deltaTime, Space.World);// 相对于某一个点转
// 参数一:相当于哪一个点 转圈圈
// 参数二:相对于那一个点的 哪一个轴转圈圈
// 参数三:转的度数 旋转速度 * 时间
this.transform.RotateAround(Vector3.zero, Vector3.right, 10 * Time.deltaTime);
(六)缩放与看向
// 相对世界坐标系
print(this.transform.lossyScale);
// 相对本地坐标系(父对象)
print(this.transform.localScale);// 注意:
// 1.同样缩放不能只改xyz 只能一起改(相对于世界坐标系的缩放大小只能得 不能改)
// 所以 我们一般要修改缩放大小 都是改的 相对于父对象的 缩放大小 localScale
this.transform.localScale = new Vector3(3, 3, 3);// 2.Unity没有提供关于缩放的API
// 之前的 旋转 位移 都提供了 对应的 API 但是 缩放并没有
// 如果你想要 让 缩放 发生变化 只能自己去写(自己算)
this.transform.localScale += Vector3.one * Time.deltaTime;// 让一个对象的面朝向 可以一直看向某一个点或者某一个对象
// 看向一个点 相对于世界坐标系的
this.transform.LookAt(Vector3.zero);
// 看向一个对象 就传入一个对象的 Transform信息
this.transform.LookAt(lookAtObj);
(七)父子关系
1.获取和设置父对象
// 获取父对象
print(this.transform.parent.name);
// 设置父对象 断绝父子关系
this.transform.parent = null;
// 设置父对象 认爸爸
this.transform.parent = GameObject.Find("Father2").transform;// 通过API来进行父子关系的设置
this.transform.SetParent(null); // 断绝父子关系
this.transform.SetParent(GameObject.Find("Father2").transform); // 认爸爸// 参数一:我的父亲
// 参数二:是否保留世界坐标的 位置 角度 缩放 信息
// true 会保留 世界坐标下的状态 和 父对象 进行计算 得到本地坐标系的信息
// false 不会保留 会直接把世界坐标系下的 位置角度缩放 直接赋值到 本地坐标系下
this.transform.SetParent(GameObject.Find("Father3").transform, false);
2.抛妻弃子
// 就是和自己的所有儿子 断绝关系 没有父子关系了
this.transform.DetachChildren();
3.获取子对象
// 按名字查找儿子
// 找到儿子的 transform信息
// Find方法 是能够找到 失活的对象的 !!!!! GameObject相关的 查找 是不能找到失活对象的
print(this.transform.Find("Cube (1)").name);
// 他只能找到自己的儿子 找不到自己的孙子 !!!!!!
print(this.transform.Find("GameObject").name);
// 虽然它的效率 比GameObject.Find相关 要高一些 但是 前提是你必须知道父亲是谁 才能找// 遍历儿子
// 如何得到有多少个儿子
// 1.失活的儿子也会算数量
// 2.找不到孙子 所以孙子不会算数量
print(this.transform.childCount);// 通过索引号 去得到自己对应的儿子
// 如果编号 超出了儿子数量的范围 那会直接报错的
// 返回值 是 transform 可以得到对应儿子的 位置相关信息
this.transform.GetChild(0);for (int i = 0; i < this.transform.childCount; i++)
print("儿子的名字:" + this.transform.GetChild(i).name);
4.儿子的操作
// 判断自己的爸爸是谁
// 一个对象 判断自己是不是另一个对象的儿子
if(son.IsChildOf(this.transform)) print("是我的儿子");// 得到自己作为儿子的编号
print(son.GetSiblingIndex());
// 把自己设置为第一个儿子
son.SetAsFirstSibling();
// 把自己设置为最后一个儿子
son.SetAsLastSibling();
// 把自己设置为指定个儿子
// 就算你填的数量 超出了范围(负数或者更大的数) 不会报错 会直接设置成最后一个编号
son.SetSiblingIndex(1);
(八)坐标转换
1.世界坐标转本地坐标
// 世界坐标系转本地坐标系 可以帮助我们大概判断一个相对位置// 世界坐标系的点 转换 为相对本地坐标系的点
// 受到缩放影响
print("转换后的点 " + this.transform.InverseTransformPoint(Vector3.forward));// 世界坐标系的方向 转换 为相对本地坐标系的方向
// 不受缩放影响
print("转换后的方向" + this.transform.InverseTransformDirection(Vector3.forward));// 受缩放影响
print("转换后的方向(受缩放影响)" + this.transform.InverseTransformVector(Vector3.forward));
2.本地坐标转世界坐标
// 本地坐标系的点 转换 为相对世界坐标系的点 受到缩放影响
print("本地转世界点" + this.transform.TransformPoint(Vector3.forward));// 本地坐标系的方向 转换 为相对世界坐标系的方向
// 不受缩放影响
print("本地转世界方向" + this.transform.TransformDirection(Vector3.forward));// 受缩放影响
print("本地转世界方向(受缩放影响)" + this.transform.TransformVector(Vector3.forward));
四、Input
(一)鼠标在屏幕上的位置
// 屏幕坐标的原点 是在 屏幕的左下角 往右是X轴正方向 往上时Y轴正方向
// 返回值时Vector3 但是只有 x和y有值 z一直是0 是因为屏幕本来就是2D的 不存在Z轴
print(Input.mousePosition);
(二)检测鼠标输入
// 鼠标按下相关检测 对于我们来说
// 比如: 1.可以做 发射子弹
// 2.可以控制摄像机 转动// 鼠标按下一瞬间 进入
// 0左键 1右键 2中键
// 只要按下的这一瞬间 进入一次
if(Input.GetMouseButtonDown(0)) print("鼠标左键按下了");// 鼠标抬起一瞬间 进入
if(Input.GetMouseButtonUp(0)) print("鼠标左键抬起了");// 鼠标长按按下抬起都会进入
// 就是 当按住按键不放时 会一直进入 这个判断
if(Input.GetMouseButton(1)) print("右键按下");// 中键滚动
// 返回值的 y -1往下滚 0没有滚 1往上滚
// 它的返回值 是Vector的值 我们鼠标中键滚动 会改变其中的Y值
print(Input.mouseScrollDelta);
(三)检测键盘输入
// 比如说 按一个键释放一个技能或者切换武器 等等的操作
// 键盘按下
if(Input.GetKeyDown(KeyCode.W)) print("W键按下");// 传入字符串的重载
// 这里传入的 字符串 不能是大写的 不然会报错
// 只能传入小写字符串
if(Input.GetKeyDown("q")) print("q按下");// 键盘抬起
if(Input.GetKeyUp(KeyCode.W)) print("W键抬起");// 键盘长按
if(Input.GetKey(KeyCode.W)) print("W键长按");
(四)检测默认轴输入
在 Edit --> Project Setting --> Input Manager 中设置默认轴
// 我们学习鼠标 键盘输入 主要是用来
// 控制玩家 比如 旋转 位移等等
// 所以Unity提供了 更方便的方法 来帮助我们控制 对象的 位移和旋转// 键盘AD按下时 返回 -1到1之间的变换
// 相当于 得到得这个值 就是我们的 左右方向 我们可以通过它来控制 对象左右移动 或者左右旋转
float h = Input.GetAxis("Horizontal");// 键盘SW按下时 返回 -1到1之间的变换
// 得到得这个值 就是我们的 上下方向 我们可以通过它来控制 对象上下移动 或者上下旋转
print(Input.GetAxis("Vertical"));// 鼠标横向移动时 -1 到 1 左 右
print(Input.GetAxis("Mouse X"));// 鼠标竖向移动时 -1 到 1 下 上
print(Input.GetAxis("Mouse Y"));// 我们默认的 GetAxis方法 是有渐变的 会总 -1~0~1之间 渐变 会出现小数
// GetAxisRaw方法 和 GetAxis使用方式相同
// 只不过 它的返回值 只会是 -1 0 1 不会有中间值
(五)其他
// 是否有任意键或鼠标长按
if(Input.anyKey) print("有一个键长按");// 是否有任意键或鼠标按下
if(Input.anyKeyDown)
{
print("有一个键 按下");
// 这一帧的键盘输入
print(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];
// 位置
print(t1.position);
// 相对上次位置的变化
print(t1.deltaPosition);
}// 是否启用多点触控
Input.multiTouchEnabled = false;// 陀螺仪(重力感应)
// 是否开启陀螺仪 必须开启 才能正常使用
Input.gyro.enabled = true;
// 重力加速度向量
print(Input.gyro.gravity);
// 旋转速度
print(Input.gyro.rotationRate);
// 陀螺仪 当前的旋转四元数
// 比如 用这个角度信息 来控制 场景上的一个3D物体受到重力影响
// 手机怎么动 它怎么动
print(Input.gyro.attitude);
(六)示例
1.用 WASD 键控制坦克的前进后退,左右转向
// Input.GetAxis("Horizontal"); 水平方向 -1到1之间的值 0就是没有按下
// Input.GetAxis("Vertical"); 竖直方向 -1到1之间的值 0就是没有按下
// ws键 控制位移
// 公式: 前进方向 * 速度 * 时间 * 当前是否移动(-1~1 相当于 正向还是反向的感觉 不按就不动 0)
this.transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical"));// ad键 控制 左右转向
// 公式: 转动的轴 * 速度 * 时间 * 当前是否移动(-1~1 相当于 正向还是反向的感觉 不按就不动 0)
this.transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime * Input.GetAxis("Horizontal"));
2.鼠标左右移动控制坦克的转向
// 鼠标输入相关
// Input.GetAxis("Mouse X");
// 公式: 转动的轴 * 速度 * 时间 * 当前是否移动(-1~1 相当于 正向还是反向的感觉 不按就不动 0)
head.Rotate(Vector3.up * headRotateSpeed * Time.deltaTime * Input.GetAxis("Mouse X"));
3.鼠标滚轮控制炮管的抬起放下
// Input.mouseScrollDelta.y
pkPos.Rotate(Vector3.right * pkRotateSpeed * Time.deltaTime * Input.mouseScrollDelta.y);
五、Screen
(一)静态属性
常用
// 当前屏幕分辨率
Resolution r = Screen.currentResolution;
print("当前屏幕分辨率的宽" + r.width + "高" + r.height);// 屏幕窗口当前宽高
// 这得到的 是当前 窗口的 宽高 不是设备分辨率的宽高
// 一般写代码 要用窗口宽高 做计算时 就用他们
print(Screen.width);
print(Screen.height);// 屏幕休眠模式
Screen.sleepTimeout = SleepTimeout.NeverSleep;
不常用
// 运行时是否全屏模式
Screen.fullScreen = true;// 窗口模式
// 独占全屏 FullScreenMode.ExclusiveFullScreen
// 全屏窗口 FullScreenMode.FullScreenWindow
// 最大化窗口 FullScreenMode.MaximizedWindow
// 窗口模式 FullScreenMode.Windowed
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);
sleepTimeout = SleepTimeout.NeverSleep;
相关文章:
Unity入门4——重要组件与API
一、GameObject (一)成员变量 // 名字 print(this.gameObject.name); this.gameObject.name "Lesson4唐老狮改名"; print(this.gameOb…...
NFS服务器安装及NFS制备程序安装
NFS服务器安装及NFS制备程序安装 NFS服务器安装 NFS是一种分布式文件系统协议,由sun公司开发,旨在允许客户端主机可以像访问本地存储一样通过网络访问服务端文件 安装NFS服务器 登录需要安装NFS服务器的主机执行以下命令完成NFS安装 yum -y install…...
matlab+yalmip+cplex求解车辆路径优化问题(VRP)--matlab中yalmip函数介绍
YALMIP是一个MATLAB工具箱,用于建模和求解优化问题。它支持线性规划、二次规划、整数规划、鲁棒优化、半定规划等优化问题的建模和求解。下面是一些常用的函数的详细介绍: 1. sdpvar:用于定义优化问题中的变量。可以定义实数、向量和矩阵型变…...
实战:用dockerfile创建镜像实现springboot项目容器化
文章目录 前言技术积累docker基本操作命令dockerfile简介dockerfile指令说明 实战演示创建dockerfile创建挂载目录构建dockerfile启动容器完成验证 写在最后 前言 docker容器化方案是当下流行的服务部署方式,在软件领域举足轻重。我公司的测试、线上环境都采用dock…...
【Flask】配置项解析与加载
文章目录 默认配置表配置项加载方式直接配置存放在app.config字典通过.py配置文件通过class类加载对象通过.json配置文件通过环境变量配置内置命令行 默认配置表 配置项默认值备注DEBUGFalse是否开启 Debug 模式。如果为True,修改了代码,只需要保存&…...
Dinky: 实时即未来,让 Flink SQL 纵享丝滑--如何本地编译、运行
什么是Dinky 实时即未来,Dinky 为 Apache Flink 而生,让 Flink SQL 纵享丝滑。 Dinky 是一个开箱即用、易扩展,以 Apache Flink 为基础,连接 OLAP 和数据湖等众多框架的一站式实时计算平台,致力于流批一体和湖仓一体的探索与实践。 最后,Dinky 的发展皆归功于 Apache …...
2023 Nature 健康系统规模的语言模型是通用预测引擎
文章目录 一、论文关键信息二、论文主要内容三、总结与讨论🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题:Health system-scale language models are all-purpose prediction engines 期刊信息:2023 Nature 论文地址:h...
《2023 年 React 生态》
大家好,我是 Chocolate。 前不久看到一篇不错的内容,来自于 The React Ecosystem in 2023,也结合自己今年使用的 React 生态总结一下。 本文并非视频演讲稿,和视频内容还是有一点点区别,视频内容相对来说会更加详细一…...
武职302303笔记-day01
这里写自定义目录标题 开发永和小票开发步骤1、对页面进行需求分析 使用CSS的方式 Order.html问题:html代码和css样式代码交织 idea开发后端程序使用chatGPT给我们打工QRCreate.java 开发永和小票 开发步骤 1、对页面进行需求分析 页面是很多文字组成,…...
Python面试高频100题【11~15题】
Python面试必知100例。收集整理了目前Python岗位常见的面试题,希望大家通过学习理解相关知识点。下面介绍的是11~15道题。 十一、请介绍下Python中单下划线与双下划线区别 在Python中,单下划线和双下划线主要用于命名变量和方法,而它们具有不…...
Linux下Redis 存储
命令使用 目录 命令使用 RDB持久化 AOF持久化 yum安装 [rootlocalhost ~]# yum -y install redis 已加载插件:fastestmirror Loading mirror speeds from cached hostfile* c7-media: * epel: ftp.yz.yamagata-u.ac.jpvim到文件etc/redis.conf 取消注释requirep…...
QML 快速上手3 - QuickControl2
目录 QuickControl2简介风格设置control 配置文件图像浏览器案例component 组件报错问题StackViewSwipeView QuickControl2 简介 quickcontrol 用于快速构建风格化的用户界面 它包括了以下几个预制的组件风格 Default QT 默认风格Universal windows 桌面风格Material 谷歌推…...
QT Creator写一个简单的电压电流显示器
前言 本文主要涉及上位机对接收的串口数据处理,LCD Number控件的使用。之前的一篇写一个简单的LED控制主要是串口发出数据,这里再看一下怎么接收数据处理数据,这样基本就对串口上位机有简单的认识了。 LCD Number显示时间 这一小节通过用一…...
前端需要的技能
语言: 1,熟练掌握html5,css3,javascript,ajax 2,掌握PHP、java、python中至少一种web开发语言 3,库/框架:MooTools,YUI,Angular,jQuery,Dojo. 4,UI框架:BootStrap,Founda…...
Qt——Qt控件之基于模型的项目视图组-QTreeView树形视图控件的使用总结(Qt仿word标题列表的实现)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》...
spring boot框架步骤
目录 1. 创建一个新的Spring Boot项目2. 添加所需的依赖3. 编写应用程序代码4. 配置应用程序5. 运行应用程序6. 编写和运行测试7. 部署应用程序 总结 当使用Spring Boot框架开发应用程序时,以下是一些详细的步骤: 1. 创建一个新的Spring Boot项目 使用…...
动态创建select
1.动态创建select function createSelect(){ var mySelect document.createElement("select"); mySelect.id "mySelect"; document.body.appendChild(mySelect); } 2.添加选项option function addOption(){ //根据id查找对象, var objdoc…...
linux-centos7操作系统查看系统未挂载的磁盘,挂载磁盘
linux-centos7操作系统查看系统未挂载的磁盘,挂载磁盘 查看当前磁盘空间 根目录 / 下也只有44G,其他目录只有10几G,正式环境肯定不够用 df -h查看硬盘数量和分区情况 fdisk -l查看到/dev/vdb 有500多G了 将/dev/vdb在分出一个区使用 第一步:编辑分区。执行命令fdisk …...
STM32软件定时器
目录 什么是定时器? 软件定时器优缺点 软件定时器原理 软件定时器相关配置 单次定时器和周期定时器 软件定时器相关 API 函数 1. 创建软件定时器 2. 开启软件定时器 3. 停止软件定时器 4. 复位软件定时器 5. 更改软件定时器定时时间 实操 cubeMX配置 …...
[论文阅读] (30)李沐老师视频学习——3.研究的艺术·讲好故事和论点
《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…...
Java中List、Set、Map的区别和实现方式
Java中List、Set、Map的区别和实现方式 List List 是一个有序的集合,即元素按照插入的顺序进行排序,可以有重复的元素。因为是有序的,所以可以根据下标来获取元素或者遍历整个集合内的元素。常用的实现类包括 ArrayList 和 LinkedList。 A…...
@EnableScheduling和@Scheduled注解详解fixedrate和fixeddelay的区别
一、pom.xml中导入必要的依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><dependencies><…...
打印金字塔图案总结
那么好了好了,宝子们,今天给大家总结一下“打印金字塔图案”,来吧,开始整活!⛳️ 最近在牛客网上刷题,遇到了这个打印类型的题目,我想总结一下,然后分享给大家。 一、正向金字塔 …...
SQL语句的执行顺序
1、SQL语句的一般执行顺序 1 from 找表 2 on 关联条件帅选 3 join 关联表操作 4 where 条件筛选 5 group by 进行分组 6 avg,sum… 执行函数 7 having 分组后筛选 8 select …...
Debian 版本代号与《玩具总动员》
作为最受欢迎的 Linux 发行版之一,Debian 是许多其他发行版的基础,许多非常受欢迎的 Linux 发行版,例如 Ubuntu、Knoppix、PureOS 、Tails、Armbian 以及 Raspbian,都基于 Debian。 经过近 20 个月的开发,2023 年 6 月…...
TypeScript 第一章
欢迎来到 TypeScript 学习!本章将为您介绍 TypeScript 的基础知识。 TypeScript 是 JavaScript 的一个超集,它提供了静态类型检查、类、接口等特性,使得编写大型应用程序变得更加容易和可维护。TypeScript 编写的代码可以被编译成 JavaScript…...
【SpringCloud入门】-- Ribbon入门
1.什么是Ribbon? Ribbon就是netflix公司的一个开源项目,主要功能是提供客户端负载均衡算法和服务调用。Ribbon客户端组件提供了完善的配置项,如连接超时,重试等等。Ribbon作为服务消费者的负载均衡器,有两种使用方式&…...
(二)Liunx下ElasticSearch快速搭建
1.下载安装 1)环境准备: 操作系统:centos7 es版本:8.8.1 jdk:17 es与jdk等兼容支持查看 2)下载安装包上传到服务器,官网地址 https://www.elastic.co/cn/downloads/elasticsearch 3)解压文件…...
神经网络编程基础
目录 1、二分类(Binary Classification) 2、逻辑回归(Logistic Regression) 3、逻辑回归的代价函数(Logistic Regression Cost Function) 4、梯度下降法(Gradient Descent) 5、使用计算图求导数 6、逻辑回归中的梯度下降&…...
2023年北京/上海/深圳DAMA-CDGA/CDGP数据治理工程师认证报名
DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…...
宁波企业网站制作/google中文搜索引擎
(点击上方公众号,可快速关注)来源:Float_Luuu,my.oschina.net/andylucc/blog/539783今天查了很多资料,主要是想搞清楚写JAVA和CacheLine有什么关系以及我们如何针对CacheLine写出更好的JAVA程序。CPU和内存CPU是计算机的大脑&…...
网站建设列入无形资产管理吗/湖南关键词优化快速
GCC 目前,GCC(GNU Compiler Collection)是Linux社区最好的编译器。GCC也就是以前的GNU C编译器(GNU C Compiler),是由egcs筹划指导委员会维护,他们的目标是让GCC成为标准的C编译器。1999年中&a…...
太原营销型网站建设/网络营销期末总结
http://www.jfox.info/bi-jiao-chang-jian-de-shu-ju-ku-sql-mian-shi-ti-yi-ji-da-an转载于:https://www.cnblogs.com/ydxblog/p/5753575.html...
上海正规网站建设耗材/合肥网络推广软件
场景开发中经常需要用到定时任务,对于商城来说,定时任务尤其多,比如优惠券定时过期、订单定时关闭、微信支付2小时未支付关闭订单等等,都需要用到定时任务,但是定时任务本身有一个问题,一般来说我们都是通过…...
广安市邻水建设局网站/谷歌应用商店下载
board目录中,主要的代码结构分为了src,include两个子目录。分别存放源代码文件。 [objc] view plaincopy#CCarm-linux-gcc CCgcc CFLAGS-lpthread INCPATH-I ../../include OBJ log.o init.o serial.o thread.o socket.o socket_dev.o systeminfo.o main.o …...
如何做网站轮播大图/关键词优化排名软件案例
mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable, high-performance, open source, schema-free, document-oriented database。…...