-
目录
扫描二维码关注公众号,回复: 14900540 查看本文章1. 仅发送消息给自己(以及身上的其他MonoBehaviour对象)
1. 在游戏对象增添Animator动画编辑器就可以加入动画
一、 控制台输出
-
1. Debug.Log("String")
- 输出字符串
-
2. Debug.LogWarning("String")
- 输出警告为字符串内容
-
3. Debug.LogError("String")
- 输出报错为字符串内容
-
-
二、 事件函数(生命周期函数)
-
1. 赋值顺序
- 变量声明并直接赋值>检视面板赋值>Awake>OnEnable>Start>外部赋值
-
2. Reset()
- 1.调用情况
- 在编辑器不调用的情况下运行
- 2.调用时间、此数和作用
- 当脚本第一次挂载到对象或者使用Reset命令之后调用
- 来初始化脚本的各个属性,Reset最常用与在检视面板中提供良好的默认值
- 1.调用情况
-
3. Awake()
- 1.调用情况
- a.在加载场景时初始化包含脚本的激活状态的GameObject时
- b.GameObject从非激活转变为激活状态
- c.在初始化使用Instantiate创建的GameObject之后
- 2.调用时间、此数和作用
- 在脚本实例的生存期内,Unity 仅调用 Awake 一次。脚本的生存期持续到包含它的场景被卸载为止。
- Awake 来代替构造函数进行初始化,在Unity这里,组件的初始化不使用构造函数
- 1.调用情况
-
4. OnEnable()
- 1.调用情况
- a.游戏物体被激活
- b.脚本组件被激活
- 2.调用时间、此数和作用
- 每次游戏物体或者脚本被激活都会调用一次
- 已添加NewBehaviour的GameObject由未激活到已激活的时候,即setActive(true)
- 脚本由不可用到可用的时候,即enabled=true
- 重复赋值 变为初始状态
- 每次游戏物体或者脚本被激活都会调用一次
- 1.调用情况
-
5. Start()
- 1.调用情况
- a.游戏物体被激活
- b.脚本组件被激活
- 2.调用时间、此数和作用
- 在脚本实例激活时在第一帧的Update之前被调用
- 后于Awake执行,方便控制逻辑的前后调用顺序
- 1.调用情况
-
6. Update()
- 1.调用情况
- a.游戏物体被激活
- b.脚本组件被激活
- 2.调用时间、此数和作用
- 每帧调用,是最常用函数,每秒调用60次左右(根据当前电脑的的性能和状态)
- 实时更新数据,接受输入数据
- 1.调用情况
-
7. LateUpdate()
- 1.调用情况
- a.游戏物体被激活
- b.脚本组件被激活
- 2.调用时间、此数和作用
- LateUpdate在调用所有Update函数后调用,每秒调用60次左右,安排脚本的执行顺序
- 比如摄像机跟随,一定是人物先移动了,摄像机才会跟随
- 1.调用情况
-
8. OnDisable()
- 1.调用情况
- a.游戏物体被禁用
- b.脚本组件被禁用
- c.游戏物体被销毁
- 2.调用时间、此数和作用
- 满足调用情况时即时调用一次,用于一些对象的状态重置,资源回收与清理
- 1.调用情况
-
9. OnApplicatoinQuit()
- 1.调用情况
- a.在程序退出之前所有的游戏对象都会调用这个函数
- b.在编辑器中会在用户终止播放模式时调用
- c.在网页视图关闭时调用
- 2.调用时间、此数和作用
- 满足调用情况时即时调用一次,用于处理一些游戏退出后的逻辑
- 1.调用情况
-
10. OnDestroy()
- 1.调用情况
- a.场景或游戏结束
- b.停止播放模式将终止应用程序
- c.在网页视图关闭时调用
- d.当前脚本被移除
- e.当前脚本挂载到的游戏物体被删除
- 2.调用时间、此数和作用
- 满足调用情况时即时调用一次,用于一些游戏物体的销毁
- 1.调用情况
-
-
三、 游戏物体
-
1. 创建方式
- a.使用构造函数(声明+实例化) 创建一个空的游戏对象
- GameObject myGo = new GameObject("MyGameObject");
- b.根据现有的预制体(游戏物体)资源或者游戏场景已有的游戏物体来实例化
- GameObject.Instantiate(grisGo);
- c.使用特别的API创建一些基本的游戏物体类型(原始几何体)
- GameObject.CreatePrimitive(PrimitiveType.Plane);
- a.使用构造函数(声明+实例化) 创建一个空的游戏对象
-
2. 游戏物体的查找和获取
- 当前游戏物体
- this
- 当前游戏物体的组件
- this.script
- this.gameObject
- 对其他游戏物体查找(这时游戏物体必须是激活状态)
- a.通过名称查找
- GameObject mainCameraGo= GameObject.Find("Main Camera");
- Debug.Log("mainCamera游戏物体的标签是:" + mainCameraGo.tag);
- b.通过标签查找
- GameObject mainCameraGo = GameObject.FindGameObjectWithTag("MainCamera");
- Debug.Log("mainCamera游戏物体的名字是:" + mainCameraGo.name);
- c.通过类型查找
- No2_EventFunction no2_EventFunction= GameObject.FindObjectOfType<No2_EventFunction>();
- Debug.Log("no2_EventFunction游戏物体的名字是:" + no2_EventFunction.name);
- d.多数查找与获取
- GameObject[] enemyGos= GameObject.FindGameObjectsWithTag("Enemy");
- BoxCollider[] colliders= GameObject.FindObjectsOfType<BoxCollider>();
- a.通过名称查找
- 当前游戏物体
-
3. 功能
- Debug.Log("当前脚本挂载到的游戏物体名称是:"+gameObject.name);
- GameObject.Instantiate;
- 实例化游戏对象,预制体实例化
- GameObject.CreatePrimitive;
- 创建基本物体
- var plane : GameObject = GameObject.CreatePrimitive(PrimitiveType.Plane);
- Debug.Log("当前游戏物体标签是:"+gameObject.tag);
- Debug.Log("当前游戏物体层级是:"+gameObject.layer);
- 游戏物体的激活失活
- Debug.Log("当前游戏物体的状态是:"+gameObject.activeInHierarchy);
- Debug.Log("当前游戏物体的状态是:" +gameObject.activeSelf);
- gameObject.SetActive(true);
-
-
四、 组件
-
1. 组件的使用与获取
- a.组件都是在某一个游戏物体身上挂载的,可以通过游戏物体查找获取之后使用
- No5_Component no5_Component = gameObject.GetComponent<No5_Component>();
- No2_EventFunction no2_EventFunction = gameObject.GetComponent<No2_EventFunction>();
- Debug.Log(no2_EventFunction.attackValue);
- 获取脚本的值
- GameObject grisGo = GameObject.Find("Gris");
- Debug.Log(grisGo.GetComponent<SpriteRenderer>());
- Debug.Log(enemyGos.GetComponentInChildren<BoxCollider>());
- Debug.Log(enemyGos.GetComponentsInChildren<BoxCollider>());
- Debug.Log(enemyGos.GetComponentInParent<BoxCollider>());
- b.通过其他组件查找
- SpriteRenderer sr= grisGo.GetComponent<SpriteRenderer>();
- sr.GetComponent<Transform>();
- this.GetComponent<Transform>();
- a.组件都是在某一个游戏物体身上挂载的,可以通过游戏物体查找获取之后使用
-
2. Transform
- 成员变量
- Debug.Log("Gris变换组件所挂载的游戏物体名字是:"+grisTrans.name);
- Debug.Log("Gris变换组件所挂载的游戏物体引用是:"+grisTrans.gameObject);
- Debug.Log("Gris下的子对象(指Transform)的个数是:"+grisTrans.childCount);
- Debug.Log("Gris世界空间中的坐标位置是:"+grisTrans.position);
- Debug.Log("Gris以四元数形式表示的旋转是:"+grisTrans.rotation);
- Debug.Log("Gris以欧拉角形式表示的旋转(以度数为单位)是"+grisTrans.eulerAngles);
- Debug.Log("Gris的父级Transform是:"+grisTrans.parent);
- Debug.Log("Gris相对于父对象的位置坐标是:"+grisTrans.localPosition);
- Debug.Log("Gris相对于父对象以四元数形式表示的旋转是:" + grisTrans.localRotation);
- Debug.Log("Gris相对于父对象以欧拉角形式表示的旋转(以度数为单位)是:" + grisTrans.localEulerAngles);
- Debug.Log("Gris相对于父对象的变换缩放是:"+grisTrans.localScale);
- Debug.Log("Gris的自身坐标正前方(Z轴正方向)是:"+grisTrans.forward);
- Debug.Log("Gris的自身坐标正右方(X轴正方向)是:" + grisTrans.right);
- Debug.Log("Gris的自身坐标正上方(Y轴正方向)是:" + grisTrans.up);
- 想用世界坐标的话,就为vecto3r.up
- 查找
- Debug.Log("当前脚本挂载的游戏对象下的叫Gris的子对象身上的Transform组件是:"+transform.Find("Gris"));
- transform就是this.transform
- Debug.Log("当前脚本挂载的游戏对象下的第一个(0号索引)子对象的Transform引用是:"+transform.GetChild(0));
- Debug.Log("Gris当前在此父对象同级里所在的索引位置:"+ grisTrans.GetSiblingIndex());
- Debug.Log("当前脚本挂载的游戏对象下的叫Gris的子对象身上的Transform组件是:"+transform.Find("Gris"));
- 静态方法
- Transform.Destroy(grisTrans);
- Transform.Destroy(grisTrans.gameObject);
- Transform.FindObjectOfType();
- Transform.Instantiate();
- 移动
- grisGo.transform.Translate(Vector2.left*moveSpeed);//自身坐标系
- grisGo.transform.Translate(-grisGo.transform.right*moveSpeed);//世界坐标系
- //grisGo.transform.Translate(Vector2.left*moveSpeed,Space.World);
- //1.第一个参数按世界坐标系移动,第二个参数指定世界坐标系(实际情况按世界坐标系移动)
- //grisGo.transform.Translate(Vector2.left * moveSpeed, Space.Self);
- //2.第一个参数按世界坐标系移动,第二个参数指定自身坐标系(实际情况按自身坐标系移动)
- //grisGo.transform.Translate(-grisGo.transform.right * moveSpeed, Space.World);
- //3.第一个参数按自身坐标系移动,第二个参数指定世界坐标系(实际情况按自身坐标系移动)
- //grisGo.transform.Translate(-grisGo.transform.right * moveSpeed, Space.Self);
- //4.第一个参数按自身坐标系移动,第二个参数指定自身坐标系(实际情况按世界坐标系移动)(一般不使用)
- 旋转
- grisGo.transform.Rotate(new Vector3(0,0,1));
- grisGo.transform.Rotate(Vector3.forward,1);
- 成员变量
-
-
五、向量
-
-
1. 静态变量
- print(Vector2.down);
- print(Vector2.up);//Y轴正方向
- print(Vector2.left);
- print(Vector2.right);//X轴正方向
- print(Vector2.one);
- print(Vector2.zero);
-
2. 构造函数
- Vector2 v2 = new Vector2(2, 2);
-
3. 成员变量
- print("V2向量的模长是:" + v2.magnitude);
- print("V2向量的模长的平方是:" + v2.sqrMagnitude);
- print("V2向量单位化之后是:" + v2.normalized);
- print("V2向量的XY值分别是:" + v2.x + "," + v2.y);
- print("V2向量的XY值分别是(使用索引器形式访问):" + v2[0] + "," + v2[1]);
-
4. 公共函数
- bool equal = v2.Equals(new Vector2(1, 1));
- print("V2向量与向量(1,1)是否相等?" + equal);
- Vector2 v2E = new Vector2(1, 3);
- bool equalv2E = v2E.Equals(new Vector2(3, 1));
- print("v2E向量与向量(3,1)是否相等?" + equal);
- bool equalv2E = v2E.Equals(new Vector2(3, 1));
- print("V2向量的单位化向量是:" + v2.normalized + "但是V2向量的值还是:" + v2);
- v2.Set(5, 9);
- 设置v2的值
- transform.position = v2;
- 将自身transform设置为v2的值
- transform.position.x = 4;//不可以单独赋值某一个值,比如x,这句话会报错
- 用属性和方法返回的结构体是不能修改其字段的,值属性
- 直接访问公有的结构体是可以修改其字段的
- 总结导致这个问题的原因:
- 1,Transform中的position是属性(换成方法也一样,因为属性的实现本质上还是方法)而不是公有字段
- 2,position的类型是Vector的,而Vector是Struct类型
- 3,Struct之间的赋值是拷贝而不是引用
- bool equal = v2.Equals(new Vector2(1, 1));
-
5. 静态函数
- Debug.Log("从va指向vb方向计算的无符号夹角是:" + Vector2.Angle(va, vb));
- print("va点与vb点之间的距离是:" + Vector2.Distance(va, vb));
- print("向量va与向量vb的点积是:" + Vector2.Dot(va, vb));
- print("向量va和向量vb在各个方向上的最大分量组成的新向量是:" + Vector2.Max(va, vb));
- print("向量va和向量vb在各个方向上的最小分量组成的新向量是:" + Vector2.Min(va, vb));
- print("va向vb按照0.5的比例进行线性插值变化之后的结果是" + Vector2.Lerp(va, vb, 0.5f));
- //具体得到的新向量的结果的计算公式是:a+(b-a)*t
- print("va向vb按照参数为-1的形式进行(无限制)线性插值变化之后的结果是" + Vector2.LerpUnclamped(va, vb, -1));
- print("将点va以最大距离不超过maxDistance为移动步频移向vb" + Vector2.MoveTowards(va, vb, maxDistance));
- float maxDistance = 0.5f;
- print("va和vb之间的有符号角度(以度为单位,逆时针为正)是" + Vector2.SignedAngle(va, vb));
- print("vb和va之间的有符号角度(以度为单位,逆时针为正)是" + Vector2.SignedAngle(vb, va));
- print("va和vb在各个方向上的分量相乘得到的新向量是:" + Vector2.Scale(va, vb));
- print(Vector2.SmoothDamp(va, vb, ref currentVelocity, 0.1f));
- 平滑移动,最高速度为currentVelocity,平滑时间为0.1f
- Vector2 currentVelocity = new Vector2(1, 0);
-
6. 控制移动
- grisTrans.position = Vector2.Lerp(grisTrans.position, targetTrans.position, 0.01f);
- 速度会先快后慢,因为Lerp里边的grisTrans.position会改变
- grisTrans.position = Vector2.Lerp(grisTrans.position, targetTrans.position, percent);
- percent += 1 * lerpSpeed * Time.deltaTime;
- 这两句话之后就匀速了
- lerp是先快后慢,moveTowards匀速
- grisTrans.position = Vector2.MoveTowards(grisTrans.position, targetTrans.position, 0.05f);
- 平滑阻尼
- grisTrans.position = Vector2.SmoothDamp(grisTrans.position, targetTrans.position, ref currentVelocity, 1);
- grisTrans.position = Vector2.Lerp(grisTrans.position, targetTrans.position, 0.01f);
-
-
六、 输入系统的接口类
-
1. 连续检测(移动)
- print("当前玩家输入的水平方向的轴值是:" + Input.GetAxis("Horizontal"));
- print("当前玩家输入的垂直方向的轴值是:" + Input.GetAxis("Vertical"));
- print("当前玩家输入的水平方向的边界轴值是:" + Input.GetAxisRaw("Horizontal"));
- print("当前玩家输入的垂直方向的边界轴值是:" + Input.GetAxisRaw("Vertical"));
- Raw就只会有1,0返回
- print("当前玩家鼠标水平移动增量是:" + Input.GetAxis("Mouse X"));
- print("当前玩家鼠标垂直移动增量是:" + Input.GetAxis("Mouse Y"));
-
2. 连续检测(事件)
- if (Input.GetButton("Fire1"))
- print("当前玩家正在使用武器1进行攻击!");
- 这个是一直按,就一直有事件实现
- print("当前玩家正在使用武器1进行攻击!");
- if (Input.GetButton("Fire2"))
- print("当前玩家正在使用武器2进行攻击!");
- if (Input.GetButton("RecoverSkill"))
- print("当前玩家使用了恢复技能回血!");
- if (Input.GetButton("Fire1"))
-
3. 间隔检测(事件)
- if (Input.GetButtonDown("Jump"))
- print("当前玩家按下跳跃键");
- 按一次,实现一次事件
- print("当前玩家按下跳跃键");
- if (Input.GetButtonUp("Squat"))
- print("当前玩家松开蹲下建");
- if (Input.GetKeyDown(KeyCode.Q))
- print("当前玩家按下Q键");
- if (Input.anyKeyDown)
- print("当前玩家按下了任意一个按键,游戏开始");
- if (Input.GetMouseButton(0))
- print("当前玩家按住鼠标左键");
- if (Input.GetMouseButtonDown(1))
- print("当前玩家按下鼠标右键");
- if (Input.GetMouseButtonUp(2))
- print("当前玩家抬起鼠标中键(从按下状态松开滚轮)");
- if (Input.GetButtonDown("Jump"))
-
4. 如果要找键,上官方文档输入Keycode来找
- 如果要改变axis里边的值,在unity点击Edit-Project Setting的Input Mannage来查看
- 如果是ButtonDown,要在Edit的InputManager编写
- 如果是KeyDown,则可以使用Keycode
-
-
七、 消息类
-
1. 仅发送消息给自己(以及身上的其他MonoBehaviour对象)
- gameObject.SendMessage("GetMsg");
- 调用GetMsg这个方法(在自身上或者是其他组件上)
- SendMessage("GetSrcMsg","Trigger");
- 调用GetSrcMsg这个方法(带参数的调用)
- 如果需要多种参数,就自己建立一个类来传递
- SendMessage("GetTestMsg",SendMessageOptions.DontRequireReceiver);
- 如果没有这个方法,就会报错,这个设置了不报错
- gameObject.SendMessage("GetMsg");
-
2. 广播消息(向下发,所有子对象包括自己)
- BroadcastMessage("GetMsg");
-
3. 向上发送消息(父对象包含自己)
- SendMessageUpwards("GetMsg");
-
-
八、 动画
-
1. 在游戏对象增添Animator动画编辑器就可以加入动画
- 选中一系列图片,拖动进入游戏对象,会自动生成动画
- 在动画编辑器里边的Parameter添加不同种类的参数使用
- 对着动画右键MakeTransition,可以添加动画过渡
- 可以再检视面板调整动画过渡时间
-
2. 脚本
- 调整动画速度
- animator.speed = 0.3f;
- 播放动画
- animator.Play("Run");
- 设置动画编辑器的参数
- animator.SetFloat("Speed", 1);
- animator.SetBool("Dead", false);
- animator.SetInteger("HP", 100);
- 获取动画编辑器参数的数值
- print("当前速度参数的值是:" + animator.GetFloat("Speed"));
- 以标准单位化时间进行淡入淡出效果来播放动画
- animator.CrossFade("Run", 0.5f);
- 以秒为单位进行淡入淡出效果来播放动画
- animator.CrossFadeInFixedTime("Run", 0.5f);
- 将速度值设置为横向轴的变换
- animator.SetFloat("Speed",Input.GetAxisRaw("Horizontal"));
- 调整动画速度
-
-
九、 时间
-
1. 脚本
- print(Time.deltaTime + ",完成上一帧所用的时间(以秒为单位)");
- print(Time.fixedDeltaTime + ",执行物理或者其他固定帧率更新的时间间隔");
- print(Time.fixedTime + ",自游戏启动以来的总时间(以物理或者其他固定帧率更新的时间间隔累计计算的)");
- print(Time.time + ",游戏开始以来的总时间");
- print(Time.realtimeSinceStartup + ",游戏开始以来的实际时间");
- print(Time.smoothDeltaTime + ",经过平滑处理的Time.deltaTime的时间");
- print(Time.timeScale + ",时间流逝的标度,可以用来慢放动作");
- print(Time.timeSinceLevelLoad + ",自加载上一个关卡以来的时间");
-
-
十、 数学方法
-
1. 脚本
-
静态变量
- print(Mathf.Deg2Rad + ",度到弧度换算常量");
- print(Mathf.Rad2Deg + ",弧度到度换算常量");
- print(Mathf.Infinity + "正无穷大的表示形式");
- print(Mathf.NegativeInfinity + "负无穷大的表示形式");
- print(Mathf.PI);
-
静态函数
- print(Mathf.Abs(-1.2f) + ",-1.2的绝对值");
- print(Mathf.Acos(1) + ",1(以弧度为单位)的反余弦");
- print(Mathf.Floor(2.74f) + ",小于或等于2.74的最大整数");
- print(Mathf.FloorToInt(2.74f) + ",小于或等于2.74的最大整数");
- print(Mathf.Lerp(1, 2, 0.5f) + ",a和b按参数t进行线性插值");
- a+(b-a)*t
- print(Mathf.LerpUnclamped(1, 2, -0.5f) + ",a和b按参数t进行线性插值");
- print("游戏倒计时:" + endTime);
- endTime = Mathf.MoveTowards(endTime,0,0.1f);
-
-
-
十一、 随机数
-
1. 脚本
-
静态变量
- print(Random.rotation + ",随机出的旋转数是(以四元数形式表示)");
- print(Random.rotation.eulerAngles + ",四元数转换成欧拉角");
- print(Quaternion.Euler(Random.rotation.eulerAngles) + ",欧拉角转四元数");
- print(Random.value + ",随机出[0,1]之间的浮点数");
- print(Random.insideUnitCircle + ",在(-1,-1)~(1,1)范围内随机生成的一个vector2");
- 在圆中随机生成一个目标
-
静态函数
- print(Random.Range(0,4)+",在区间[0,4)(整形重载包含左Min,不包含右Max)产生的随机数");
- print(Random.Range(0, 4f) + ",在区间[0,4)(浮点形重载包含左Min,包含右Max)产生的随机数");
- Random.InitState(1);
- print(Random.state+",当前随机数生成器的状态");
- 这个可以看版本数
- 伪随机数
- 设置随机数状态,在其他机器也能生成一样的数,版本为1
- print(Random.state+",当前随机数生成器的状态");
- print(Random.Range(0,4f)+",设置完随机数状态之后在[0,4]区间内生成的随机数");
-
-
-
十二、 鼠标操作
-
1. 脚本
- private void OnMouseDown()
- print("在Gris身上按下了鼠标");
- print("鼠标在Gris身上松开了");
- private void OnMouseUpAsButton()
- print("鼠标悬停在了Gris上方");
- private void OnMouseOver()
- private void OnMouseExit()
- print("鼠标移出了Gris");
- print("鼠标移入了Gris");
- private void OnMouseEnter()
- print("在Gris身上用鼠标进行了拖拽操作");
- private void OnMouseDrag()
- private void OnMouseUp()
- print("在Gris身上按下的鼠标抬起了");
- private void OnMouseDown()
-
2. 注意事项
- 需要对游戏对象添加碰撞器,collider才能检测到鼠标点动
-
-
十三、 协程
-
1. 脚本
- 协程的启动
- StartCoroutine("ChangeState");
- StartCoroutine(ChangeState());
- IEnumerator ie = ChangeState();
- StartCoroutine(ie);
- 协程的停止
- StopCoroutine("ChangeState");
- StopCoroutine(ie);
- 无法停止协程
- StopCoroutine(ChangeState());
- 因为没有把协同对象传递过来
- StopCoroutine(ChangeState());
- StopAllCoroutines();
- 关闭所有协同
- StartCoroutine("CreateGris");
- IEnumerator协程方法编写
- yield return new WaitForSeconds(2);
- 停止两秒再用
- yield return null;
- 等待一帧 yield return n(n是任意数字)
- yield return new WaitForEndOfFrame();
- 在本帧帧末执行以下逻辑
- yield break;
- 跳出方法,类似break
- yield return new WaitForSeconds(2);
- 小知识
- Instantiate(animator.gameObject);
- 可以通过组件去定位到自身的游戏对象
- Instantiate(animator.gameObject);
- 协程的启动
-
2. 作用
- 1.延时调用,2.和其他逻辑一起协同执行
- (比如一些很耗时的工作,在这个协程中执行异步操作,比如下载文件,加载文件等)
-
-
十四、 调用
-
1. 脚本
- Invoke("CreateGris",3);
- 停止3S后调用这个方法
- InvokeRepeating("CreateGris",1,1);
- 重复调用
- 第二个是停止时间
- 第三个是重复速率
- 重复调用
- CancelInvoke("CreateGris");
- //停止
- CancelInvoke();
- 所有调用停止
- IsInvoking("CreateGris")
- 是否有Invoke调用了
- Invoke("CreateGris",3);
- 作用
- 延时调用方法
-
-
十五、 刚体
-
1. 注意事项
- 一般物理系统代码放进FixedUpdate里边
- 可以调整mass来调整物体质量
-
2. 脚本
- print(rb.gravityScale+",该对象受重力影响的程度");
- rb.gravityScale = 0;
- 这样就不受重力影响
- rb.gravityScale = 0;
- //rb.AddForce(Vector2.right*10);
- //rb.AddForce(Vector2.right * 10,ForceMode2D.Impulse);
- 第二个是施加力的方式
- //rb.AddForce(Vector2.right * 10,ForceMode2D.Impulse);
- rb.velocity = Vector2.right *moveSpeed;
- rb.MovePosition(rb.position+Vector2.right*moveSpeed*Time.fixedDeltaTime);
- 根据速度移动
- rb.MoveRotation(rb.rotation+angle*Time.fixedDeltaTime);
- 根据角度旋转
- //rb.MoveRotation(90);
- print(rb.gravityScale+",该对象受重力影响的程度");
-
-
十六、 音频
-
1. 注意事项
- 组件为AudioSource
- AudioClip可以选择剪辑好的音频
- loop循环
- 设置一个状态字段,这样就能知道目前状态然后进行更改
- 先设置状态字段,State,有个默认值
- 然后想更改状态之后,查看状态字段目前的值,取反,并且赋予字段
- 每一次都能知道状态值是啥了
-
2. 脚本
- private AudioSource audioSource = GetComponent<AudioSource>();
- 音频获取组件
- audioSource.clip = musicClip;
- 设置音频文件
- musicClip为AudioClip类
- audioSource.Play();
- 播放音频
- audioSource.volume = 1;
- 设置音量
- audioSource.time = 3;
- 设置起始时间
- 禁音
- private bool muteState;
- 设置字段,设置初始值
- audioSource.mute = muteState;
- 根据状态赋值
- muteState = !muteState;
- 更改下一次状态值
- private bool muteState;
- audioSource.Pause();
- 暂停
- 暂停只是在那个时间停止
- 暂停
- audioSource.UnPause();
- 取消暂停
- audioSource.Stop();
- 停止
- AudioSource.PlayClipAtPoint(soundClip,transform.position);
- 在position点生成一个点声源播放一次
- 循环用的话,就循环生成点声源
- audioSource.PlayOneShot(soundClip);
- 播放一次
- private AudioSource audioSource = GetComponent<AudioSource>();
-
-
十七、 碰撞检测
-
1. 注意事项
- 一方有刚体且要运动
- 双方要有碰撞体
- 点击触发器就不会发生受力现象Triggle
-
2. 脚本
- private void OnCollisionEnter2D(Collision2D collision)
- private void OnTriggerEnter2D(Collider2D collision)
- Debug.Log(collision.gameObject.name);
- 碰撞到的游戏物体名字
- Debug.Log(collision.gameObject.name);
- private void OnCollisionStay2D(Collision2D collision)
- Debug.Log("在碰撞器里");
- private void OnCollisionExit2D(Collision2D collision)
- Debug.Log("从碰撞器里移出");
- private void OnTriggerStay2D(Collider2D collision)
- Debug.Log("在触发器里");
- 需要把IsTriggle设置为True
- private void OnTriggerExit2D(Collider2D collision)
- Debug.Log("从触发器里移出");
- private void OnTriggerEnter2D(Collider2D collision)
- private void OnCollisionEnter2D(Collision2D collision)
-
-
十八、 资源加载
-
1. 注意事项
- 添加一个Resources文件夹放文件就方便加载了,无需吧文件路径再写进去了
- 文件夹名称一定要对
- 添加一个Resources文件夹放文件就方便加载了,无需吧文件路径再写进去了
-
2. 脚本
- AudioClip audioClip = Resources.Load<AudioClip>("sound");
- 加载音频脚本
- AudioSource.PlayClipAtPoint(audioClip, transform.position);
- 可以进行播放
- AudioSource.PlayClipAtPoint(Resources.Load<AudioClip>("sound"), transform.position);
- 只播放一次的话可以这么写
- Instantiate(Resources.Load<GameObject>(@"Prefabs/GrisCollierTest"));
- 通过文件路径进行加载
- 默认也是从Resources文件夹开始
- Object obj = Resources.Load("sound");
- 通过obj来取
- AudioClip ac = obj as AudioClip;
- as的作用是如果转换不了就返回null
- AudioClip ac = (AudioClip)obj;
- 这样转换不了就会报错
- AudioSource.PlayClipAtPoint(ac, transform.position);
- Resources.LoadAll<AudioClip>("Prefabs");
- 加载所有Prefabs文件夹的音频文件
- AudioClip[] audioClips = Resources.LoadAll<AudioClip>("");
- 加载此文件夹下的所有音频文件
- foreach (var item in audioClips)
- Debug.Log(item);
- 可以通过foreach调用
- Resources.UnloadAsset
- 资源释放,一般不用因为C#有垃圾回收
- AudioClip audioClip = Resources.Load<AudioClip>("sound");
-
-
十九、 场景管理
-
1. 注意事项
- 切换场景之前需要把Sence放到File-BuildSetting里边才能进行加载
-
2. 脚本
- SceneManager.LoadScene(1);
- 通过序号加载场景
- SceneManager.LoadScene("TriggerTest");
- 通过名称来加载场景
- SceneManager.LoadSceneAsync(2);
- 异步加载
- 可以不妨碍当前场景的运动
- private AsyncOperation ao;
- 通过异步加载器可以进行控制
- ao.allowSceneActivation = false;
- 设置加载完毕后不激活场景
- ao.progress
- 可以获取异步加载过程,一般大于0.9f就可以转换场景了
- 异步加载
- SceneManager.LoadScene(1);
-
第三章 Unity基础之API
猜你喜欢
转载自blog.csdn.net/weixin_51374560/article/details/127681968
今日推荐
周排行