如何实现摄像机跟随
比如摄像机的位置 (0,0,5)
玩家位置为(0,0,2)
一开始先计算摄像机和玩家的位置 是多少首先
摄像机的位置 – 玩家的位置 等于 偏移量(0,0,3)
然后 偏移量 + 玩家的位置 赋值给摄像机就等于 玩家和摄像机之间固定距离是多少
摄像机跟随 建议放在LateUpdate 生命周期中 因为这个生命周期适合做跟随效果
//start中进行初始偏移
offersPosition = transform.position - target.transform.position;
//变换后的偏移
offersPosition =nowPosition - target.transform.position;
//之后
放入LateUpdate进行更新摄像机位置
transform.position = offersPosition + target.transform.position;
但是有时候,相机在旋转过程中,会出现相机的下坠或者位置不符合
同样我这里出现了这情况
解决方案:
我通过计算摄像机和人物之间的距离,使其始终保持一定的距离
//start
var qua = Quaternion.LookRotation(target.transform.position - transform.position);
var euler = qua.eulerAngles;
euler.x = 0;
euler.z = 0;
euler.y = nowPosition.y;
qua = Quaternion.Euler(euler);
transform.rotation = Quaternion.Lerp(transform.rotation, qua, 0.5f);
//transform.LookAt(target.transform.position);
offersPosition = transform.position - target.transform.position;
//求摄像机和目标点之间的距离
targetDistance = currentDistance = Vector3.Distance(target.transform.position, transform.position);
//变化中写
currentDistance = Mathf.Lerp(currentDistance, targetDistance, zoomDamp);
///LateUpdate
transform.position = target.transform.position - transform.forward * currentDistance+new Vector3(0,2,0);
现在展示全部代码,这里我用了easytouch5插件,进行触摸滑动屏幕,改变旋转
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HedgehogTeam.EasyTouch;
public class CameraController : MonoBehaviour
{
/// <summary>
/// 目标
/// </summary>
public GameObject target;
private Vector3 nowPosition;
private Vector3 offersPosition;
public Vector3 targetEndPosition;
/// <summary>
/// 当前距离
/// </summary>
protected float currentDistance;
/// <summary>
/// 目标距离
/// </summary>
protected float targetDistance;
Vector3 targetOffset;
[Range(0, 3)]
public float zoomDamp = 3;
private float ratateSpeed = 5.0f;
private void Start()
{
target = GameObject.FindGameObjectWithTag("Player");
nowPosition = transform.position;
targetEndPosition = target.transform.position;
var qua = Quaternion.LookRotation(target.transform.position - transform.position);
var euler = qua.eulerAngles;
euler.x = 0;
euler.z = 0;
euler.y = nowPosition.y;
qua = Quaternion.Euler(euler);
transform.rotation = Quaternion.Lerp(transform.rotation, qua, 0.5f);
//transform.LookAt(target.transform.position);
offersPosition = transform.position - target.transform.position;
//求摄像机和目标点之间的距离
targetDistance = currentDistance = Vector3.Distance(target.transform.position, transform.position);
}
private void Update()
{
Gesture gesture = EasyTouch.current;
Vector2 gestureStartPos = gesture.startPosition;
Vector2 gestureEndPos = gesture.position;
if (gesture != null&&gesture.position.x>Screen.width/2)
{
Debug.Log("ges" + gesture.position.x + "pinmu" + Screen.width / 2);
if (gesture.swipe == EasyTouch.SwipeDirection.Right || gesture.swipe == EasyTouch.SwipeDirection.Left)
{
Debug.Log("000");
OnSwipeRight(gesture);
}
}
}
Quaternion qua;
private void LateUpdate()
{
// transform.position = offersPosition + target.transform.position;
transform.position = target.transform.position - transform.forward * currentDistance+new Vector3(0,2,0);
}
private void OnSwipeRight(Gesture gesture)
{
int nun = 1;
if (gesture.swipe == EasyTouch.SwipeDirection.Right)
{
nun = 1;
}
if (gesture.swipe == EasyTouch.SwipeDirection.Left)
{
nun = -1;
}
transform.RotateAround(target.transform.position, target.transform.up, gesture.position.x * nun * Time.deltaTime);
target.transform.RotateAround(target.transform.position, target.transform.up, gesture.position.x * nun * Time.deltaTime);
//nowPosition.x = transform.position.x;
//nowPosition.z = transform.position.z;
//offersPosition =nowPosition - target.transform.position;
currentDistance = Mathf.Lerp(currentDistance, targetDistance, zoomDamp);
}
}

380

被折叠的 条评论
为什么被折叠?



