墙体遮挡后拉近视角"/>
【Unity】第三人称3D游戏中角色被墙体遮挡后拉近视角
学习Unity过程中,遇到了角色被墙体遮挡这一问题。能想到的解决方法有“对墙体不进行渲染”和“拉近视角”这两种,前者好像在网游里见得比较多,而其他端游和主机游戏还是用的后者。
这里试着用拉近视角的方式,令角色物体头部每帧朝相机位置发出射线,若射线打到了墙体,则将相机移动到打击点处。
代码如下:
public float distance;public Transform character;void Start(){character = GameObject.Find("Player").transform; //传入角色物体的引用distance = Vector3.Distance(transform.position, character.position); //记录相机和角色的初始距离}void MoveCamera(){if (Physics.Raycast(character.position, //从角色物体的原点发出射线(一般情况下原点是角色模型的脚部,所以需要自己根据实际调整该点)transform.position - character.position, //射线方向out RaycastHit hit,distance) //最大距离只需要到相机为止&& hit.collider.CompareTag("Wall")) //如果射线打到了collider,则判断其是否是墙体{Vector3 newPoint = hit.point; //若是墙体,则将打到的点设为相机的新位置transform.position = newPoint;}else{//如果射线没有打到任何collider,或者打到的不是墙体,则将相机和角色之间的距离还原Vector3 p = (transform.position - character.position).normalized * distance;transform.position = character.position + p;}}
让我来运行看看——
这正是我想要的效果。再优化一下,使用Vector3.Lerp()方法使相机移动更为平滑,修改代码如下:
float distance;Transform character;void Start(){character = GameObject.Find("Player").transform; //传入角色物体的引用distance = Vector3.Distance(transform.position, character.position); //记录相机和角色的初始距离}void MoveCamera(){if (Physics.Raycast(character.position, //从角色物体的原点发出射线(一般情况下原点是角色模型的脚部,所以需要自己根据实际调整该点)transform.position - character.position, //射线方向out RaycastHit hit,distance) //最大距离只需要到相机为止&& hit.collider.CompareTag("Wall")) //如果射线打到了collider,则判断其是否是墙体{Vector3 newPoint = hit.point; //若是墙体,则将打到的点设为相机的新位置transform.position = Vector3.Lerp(transform.position, newPoint, 0.5f); //速度比例这里设为0.5,如果感觉移动慢了可以调高数值}else{//如果射线没有打到任何collider,或者打到的不是墙体,则将相机和角色之间的距离还原Vector3 p = (transform.position - character.position).normalized * distance;Vector3 newPoint = character.position + p;transform.position = Vector3.Lerp(transform.position, newPoint, 0.5f);}}
问题这样就解决了。
更多推荐
【Unity】第三人称3D游戏中角色被墙体遮挡后拉近视角
发布评论