前文:https://blog.csdn.net/Jaihk662/article/details/86749803(摄像机与Game视图)
后篇:https://blog.csdn.net/Jaihk662/article/details/88062565(解决摄像机跟随中的视野遮挡问题)
一、直接挂载
直接将摄像机作为主角的子物体
没了……
二、固定距离跟随方式
脚本如下:挂在摄像机上即可
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMana : MonoBehaviour
{
Vector3 dir;
public GameObject myTank;
void Start()
{
//记录摄像机与物体的距离dir
dir = myTank.GetComponent<Transform>().position - gameObject.GetComponent<Transform>().position;
}
void Update()
{
//保证dir不变
gameObject.GetComponent<Transform>().position = myTank.GetComponent<Transform>().position - dir;
}
}
三、距离+方向跟随
Vector3.Lerp(from, to, t):"from"和"to"以及API返回值都为向量,t为参数,用于返回差值向量 from+(to-from)*t
Transform.LookAt(Vector3):使游戏对象看向该坐标点(游戏对象的z轴指向Vector3)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
Vector3 aim;
public float m_Up = 10;
public float m_Forward = -10;
public float m_Speed = 10;
private Transform tankTran;
void Start()
{
tankTran = GameObject.Find("Tank").transform;// GetComponent<Transform>();
}
void LateUpdate()
{
aim = tankTran.position + Vector3.up * m_Up + tankTran.forward * m_Forward;
transform.position = Vector3.Lerp(transform.position, aim, m_Speed * Time.deltaTime);
transform.LookAt(tankTran);
}
}
四、鼠标移动视角+摄像机跟随的一个简单实现
部分API:https://blog.csdn.net/Jaihk662/article/details/87643141
- Mathf.Clamp(val, 10, 80):如果val<10或val>80返回10和80,否则返回val
- Camera.main.fieldOfView:摄像机的视野/聚焦,可以用来实现滚轮控制视野大小
- Transform.RotateAround(Vector3 point, Vector3 axis, float angle):物体以point为中心绕着轴axis,旋转角度angle
注意:这个代码因为相机的跟随用的是插值运算,所以会导致相机跟角色有位置差,屏幕可能会出现抖动,如果出现这个问题就直接暴力赋值就ok了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMove : MonoBehaviour
{
Vector3 dis;
private int type;
public float myUp = 10;
public float myForward = -10;
public float mySpeed = 3;
private Transform playerTran, myTran;
void Start()
{
type = 1;
playerTran = GameObject.Find("player_archer_nerwin").transform;// GetComponent<Transform>();
myTran = this.GetComponent<Transform>();
LookPlayer();
}
void Update()
{
if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.Z))
type ^= 1;
float left, up, forward;
if (Input.GetMouseButton(1)) //通过获得鼠标横纵轴移位,来控制摄像头视角移动,z轴保持不变
{
up = Input.GetAxis("Mouse Y");
left = Input.GetAxis("Mouse X");
myTran.RotateAround(playerTran.position, playerTran.up, left * mySpeed);
if ((myTran.position.y >= 2.5 || up < 0) && (myTran.position.y <= 7.5 || up > 0))
myTran.RotateAround(playerTran.position, myTran.right, -up * mySpeed);
dis = myTran.position - playerTran.position;
}
forward = Camera.main.fieldOfView;
forward -= Input.GetAxis("Mouse ScrollWheel") * 8;
forward = Mathf.Clamp(forward, 10, 80);
Camera.main.fieldOfView = forward;
}
void LateUpdate()
{
if (Input.GetAxis("Vertical") != 0.0f || Input.GetAxis("Horizontal") != 0.0f) //如果主角开始移动,则摄像机紧跟随,此时不能移动视角,只能控制聚焦
LookPlayerInPlay();
}
void LookPlayer()
{
myTran.position = playerTran.position;
myTran.position += Vector3.up * myUp;
myTran.position += playerTran.forward * myForward;
myTran.LookAt(playerTran);
dis = myTran.position - playerTran.position;
}
void LookPlayerInPlay()
{
if (type == 0) //两种摄像机跟随方式
{
myTran.position = playerTran.position + dis;
transform.LookAt(playerTran);
}
else
{
myTran.position = playerTran.position;
myTran.position += Vector3.up * myUp;
myTran.position += playerTran.forward * myForward;
myTran.LookAt(playerTran);
dis = myTran.position - playerTran.position;
}
}
}