Unity: Trigger, Collider, UI & NPC Interaction
Unity中的物体可以根据双方的触发器与碰撞器产生交互。
触发器与碰撞器有三种不同的状态,Enter,Stay与Exit。
1 | //触发器事件, Tigger |
不同的移动方法与触发器和碰撞器产生的交互也不相同:
实现角色之间的交互,当玩家接近NPC时,NPC会面向玩家。当玩家远离NPC时,NPC会回归自己的朝向。
当NPC的触发器与玩家接触时(Enter),调用OnTriggerEnter(),修改枚举状态。
计算NPC到玩家的方向向量,将NPC旋转指向玩家。
当NPC的触发器与玩家分离时(Exit), 调用OnTriggerExit(),修改枚举状态。
将NPC的方向恢复到原有的方向向量。
1 | using System.Collections; |
调用Resource下的相对路径文件。
导入UnityEngine.UI包。
将UI对象实例化,并挂载到附节点上。
从Resource中获得Text,Image等UI对象。
根据场景决定显示NPC名字还是HP血条。
在进行显示时,需要将NPC和玩家的世界坐标系位置转化到屏幕坐标系,将名字显示在屏幕。
1 | using System.Collections; |
为了判断我们的场景,我们需要创建一个SceneManager并挂载到Manager上。
当当前场景是主场景时返回true。
1 | using System.Collections; |
Unity: Move, Camera Tracking, Animator
最近跟着网络上的课程班学习了一些Unity的使用,记录一下自己的学习心得。
实现角色的移动需要在Update方法里对物体的位置进行更新。
Unity支持数学公式,角色控制器以及刚体等移动方式。
而每种方式又有不同的子方法。
我们先要根据input获取键盘上对应的操作命令。
如果水平和垂直数值均为0,则直接返回,不进行下面的更新命令。
将输入的方向新建为一个向量。
然后将其转换为一个四元数,通过rotation方法对角色进行旋转。
1 | float h = Input.GetAxis("Horizontal"); |
我们可以直接以数学公式的方法更新当前位置,将其加入向量乘以帧时间乘以速度的方式更新当前位置:transform.position += transform.forward * Time.deltaTime * mfMoveSpeed;
也可以使用Translate()方法,注意这里需要传入world空间模式transform.Translate(transform.forward * Time.deltaTime * mfMoveSpeed, Space.World);
MoveTowards方法,不太常用。transform.position = Vector3.MoveTowards(transform.position, transform.position + transform.forward * Time.deltaTime * mfMoveSpeed, Time.deltaTime * mfMoveSpeed);
这种模式需要在全局变量中创建并获取角色控制器对象。
使用角色控制器需要设定其盒子范围。
1 | m_characterController = transform.gameObject.GetComponent<CharacterController>(); |
我们也可以使用角色控制器移动角色。
Simple Move模式可以直接模拟重力:m_characterController.SimpleMove(transform.forward * mfMoveSpeed);
注意Simple Move模式下按秒进行移动,不需要乘以帧时间。
Move模式则需要手动添加向下的重力,否则物体Y轴移动后不会下降。m_characterController.Move(-transform.up * Time.deltaTime * mfMoveSpeed);m_characterController.Move(transform.forward * Time.deltaTime * mfMoveSpeed);
首先需要在全局变量中创建并获取刚体对象。
刚体模式需要创建碰撞盒,并且将Y轴freeze,否则物体会直接向下落下。
1 | m_rigidbody = transform.gameObject.GetComponent<Rigidbody>(); |
可以采用恒速的velocity方法m_rigidbody.velocity = transform.forward * mfMoveSpeed;
或者采用AddForce方法,这样会不断加速。m_rigidbody.AddForce(transform.forward * mfMoveSpeed * mAddForceFactor);
MovePosition方法,同样是直接计算移动后的位置。m_rigidbody.MovePosition(transform.position + transform.forward * Time.deltaTime * mfMoveSpeed);
脚本需要挂在到相机下。
两个向量相减的几何意义是减数方向指向被减数方向。
用相机位置减去玩家的位置,则可以得到玩家指向相机的向量。
然后在Update中实时更新相机的位置,就可以实现镜头跟随的效果。
1 | using System.Collections; |
模型下需要有Anim模块才能实现动画。
原有的资源里已经制作了动画,在这里额外实现的是根据动作来切换动画。
在Start()里初始化成员变量Animator m_anim。m_anim = transform.Find("Anim").GetComponent<Animator>();
然后在Update()里使用SetBool方法对Animator的开关真值进行更新。m_anim.SetBool("bMove", h != 0 || v != 0);
Animator支持几种类型的trigger如Bool,Int,