unity相机第三人称旋转和碰撞检测

相机旋转
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cameraRotate : MonoBehaviour {

    public float sensitivity = 2;
    public float smoothing = 5;
    private float MouseX;
    private float MouseY;
    private Vector2 mouseLook;
    private Vector2 mouseWatch;
    public float minAngle = -15;
    public float maxAngle = 30;

    // Use this for initialization
    void Start () {
        Cursor.lockState = CursorLockMode.Locked;
	}
	
	// Update is called once per frame
	void Update () {
        Vector2 md = new Vector3(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));
        md = Vector2.Scale(md, Vector3.one * sensitivity * smoothing);
        mouseWatch.x = Mathf.Lerp(mouseWatch.x, md.x, 1 / smoothing);
        mouseWatch.y = Mathf.Lerp(mouseWatch.y,md.y,1/smoothing);
        mouseLook += mouseWatch;
        mouseLook.y = Mathf.Clamp(mouseLook.y,minAngle,maxAngle);
        transform.localRotation = Quaternion.Euler(-mouseLook.y,mouseLook.x,0);
        
	}
}
相机射线检测碰撞
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class anotherCameraCollision : MonoBehaviour {

    public float minDistance = 1;
    public float maxDistance = 2;//设置镜头拉近,拉远的最大距离,和最小距离
    public int smoothing = 10;
    public int CamSpeed = 10;
    private float distance;
    private Vector3 cameraDir; //camera的本地方向
    private float initCamDistance; //刚开始camera距父跟随物体的距离

	// Use this for initialization
	void Start () {

        cameraDir = (transform.position - transform.parent.position).normalized; //通过这种方式求出来的是transform.localPosition是本地坐标,
        //本地坐标不能用于射线检测,要用世界坐标。
        initCamDistance = (transform.parent.position - transform.position).magnitude;
        distance = initCamDistance;
    }
	
	// Update is called once per frame
	void Update () {
        RaycastHit hit;
        Vector3 targetEndCast = transform.TransformPoint(cameraDir*distance);//求出射线检测的终止点,由于camera位置是过渡赋值,所以一定远于distance
        if (Physics.Linecast(transform.parent.position,targetEndCast,out hit))
        {
            distance = Mathf.Lerp(minDistance,maxDistance,1/smoothing);
        }
        else
        {
            distance = maxDistance;
        }
        transform.localPosition = Vector3.Lerp(transform.localPosition,distance*cameraDir,Time.deltaTime*CamSpeed);
	}
}

猜你喜欢

转载自blog.csdn.net/Icecoldless/article/details/81813835