Unity3D实践1:摄像机跟随

 

前文: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;
        }
    }
}

 


版权声明:本文为Jaihk662原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。