黑魂向project制作学习三:摄像头碰撞(Camera Collisions)

编程入门 行业动态 更新时间:2024-10-17 19:23:18

黑魂向project制作学习三:<a href=https://www.elefans.com/category/jswz/34/1767894.html style=摄像头碰撞(Camera Collisions)"/>

黑魂向project制作学习三:摄像头碰撞(Camera Collisions)

文章目录

    • 一、纠正摄像头的一些僵硬
    • 二、撰写摄像头碰撞检测函数
    • 三、为摄像头新功能做调整

一、纠正摄像头的一些僵硬

  • 摄像头的问题
    ①有一点tad jittery ,因为是用了lerp,我们应该用smooth tamp
    ②当人物沿着墙边走,摄像头可以看出来已跑进墙体里面了
  • 修正
    ①先修正jittery:方法就是修改camera Handler
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace SG
{public class CameraHandler : MonoBehaviour{//摄像头即将要到达的坐标public Transform targetTransform;//摄像头真正的实时坐标public Transform cameraTransform;//this is how camera is going to turn on a swivel(转向),make camera rotate,rotate around the pivot//让摄像机绕pivot旋转的坐标public Transform cameraPivotTransform;//人物坐标private Transform myTransform;//摄像头的坐标private Vector3 cameraTransformPosition;//用于摄像头碰撞的bit位private LayerMask ignoreLayers;private Vector3 cameraFollowVelocity = Vector3.zero;public static CameraHandler singleton;//初始化默认值public float lookSpeed = 0.1f;public float followSpeed = 0.1f; public float pivotSpeed = 0.03f;private float targetPosition;//默认摄像头的z轴坐标private float defaultPosition; private float lookAngle;private float pivotAngle;public float minimimPivot = -35;public float maximumPivot = 35;public float cameraSphereRadius = 0.2f;public float cameraCollisionOffset = 0.2f;public float minimumCollisionOffset = 0.2f;public void Awake(){singleton = this;//Application.targetFrameRate = 60;//自己坐标就是人物的坐标myTransform = transform;defaultPosition = cameraTransform.localPosition.z;//下节课将更多摄像头和环境忽略的layer碰撞ignoreLayers = ~(1 << 8 | 1 << 9 | 1 << 10);}//will be used on update, 意味着每帧都会调用,让摄像头去跟随targettransform的top position(z轴顶部位置),也就是让摄像头跟着人走 public void FollowTarget(float delta){//Vector3 targetPosition = Vector3.Lerp(myTransform.position, targetTransform.position, delta / followSpeed);Vector3 targetPosition = Vector3.SmoothDamp(myTransform.position, targetTransform.position, ref cameraFollowVelocity,delta / followSpeed);myTransform.position = targetPosition;//调整摄像头碰撞HandleCameraCollisions(delta);}//这个函数去掌握摄像头的旋转public void HandlerCameraRotation(float delta,float mouseXInput,float mouseYInput){//这样摄像头就会处在两个pivot之间,不能走更高或更低lookAngle += (mouseXInput * lookSpeed) / delta;pivotAngle -= (mouseYInput * pivotSpeed) / delta;//这会让摄像头卡在两个pivot角度之前,不能更高或更低(总体70°)pivotAngle = Mathf.Clamp(pivotAngle, minimimPivot, maximumPivot);Vector3 rotation = Vector3.zero;rotation.y = lookAngle;Quaternion targetRotation = Quaternion.Euler(rotation);myTransform.rotation = targetRotation;rotation = Vector3.zero;rotation.x = pivotAngle;targetRotation = Quaternion.Euler(rotation);cameraPivotTransform.localRotation = targetRotation;}private void HandleCameraCollisions(float delta){targetPosition = defaultPosition;RaycastHit hit;Vector3 direction = cameraTransform.position - cameraPivotTransform.position;direction.Normalize();if(Physics.SphereCast(cameraPivotTransform.position,cameraSphereRadius,direction,out hit,Mathf.Abs(targetPosition),ignoreLayers)){float dis = Vector3.Distance(cameraPivotTransform.position, hit.point);targetPosition = -(dis - cameraCollisionOffset);}if(Mathf.Abs(targetPosition) < minimumCollisionOffset){targetPosition = -minimumCollisionOffset;}cameraTransformPosition.z = Mathf.Lerp(cameraTransform.localPosition.z, targetPosition, delta / 0.2f);cameraTransform.localPosition = cameraTransformPosition;}}}

二、撰写摄像头碰撞检测函数

        private void HandleCameraCollisions(float delta){targetPosition = defaultPosition;RaycastHit hit;Vector3 direction = cameraTransform.position - cameraPivotTransform.position;direction.Normalize();if(Physics.SphereCast(cameraPivotTransform.position,cameraSphereRadius,direction,out hit,Mathf.Abs(targetPosition),ignoreLayers)){float dis = Vector3.Distance(cameraPivotTransform.position, hit.point);targetPosition = -(dis - cameraCollisionOffset);}if(Mathf.Abs(targetPosition) < minimumCollisionOffset){targetPosition = -minimumCollisionOffset;}cameraTransformPosition.z = Mathf.Lerp(cameraTransform.localPosition.z, targetPosition, delta / 0.2f);cameraTransform.localPosition = cameraTransformPosition;}

三、为摄像头新功能做调整

①调整camera Holder和Camera Pivot的Layer为Controller
②Main Camera保持为default的就行

更多推荐

黑魂向project制作学习三:摄像头碰撞(Camera Collisions)

本文发布于:2023-06-26 04:16:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/889157.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:摄像头   习三   project   Camera   Collisions

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!