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;
        }
    }
}

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中实现摄像机跟随人物,可以使用以下两种方式: 1. 通过脚本控制摄像机位置和旋转 可以在摄像机上添加一个脚本,通过脚本代码实现摄像机跟随人物的效果。具体实现步骤如下: 1)获取人物的Transform组件,即人物的位置和旋转信息。 2)将摄像机的位置和旋转信息设置为人物的位置和旋转信息,可以通过Vector3.Lerp()方法实现平滑跟随。 3)在Update()方法中不断更新摄像机的位置和旋转信息,从而实现摄像机跟随效果。 示例代码: ``` public class CameraFollow : MonoBehaviour { public Transform target; // 人物的Transform组件 public float smoothTime = 0.3f; // 平滑跟随时间 private Vector3 velocity = Vector3.zero; void Update() { // 计算摄像机新的位置 Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10)); // 平滑跟随 transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime); // 计算摄像机新的旋转角度 transform.LookAt(target); } } ``` 2. 使用Unity跟随组件 Unity提供了一个跟随组件(Follow),可以通过简单的配置实现摄像机跟随人物的效果。具体实现步骤如下: 1)在摄像机上添加一个跟随组件(Component -> New Script -> Follow)。 2)将跟随组件的Target设置为人物的Transform组件。 3)调整跟随组件的其他参数,例如跟随速度、距离等。 示例代码: ``` using UnityEngine; using UnityStandardAssets.Utility; public class CameraFollow : MonoBehaviour { public Transform target; // 人物的Transform组件 public float distance = 10f; // 摄像机与人物的距离 public float height = 5f; // 摄像机与人物的高度 public float damping = 1f; // 跟随速度 private FollowTarget followTarget; void Start() { followTarget = GetComponent<FollowTarget>(); followTarget.target = target; followTarget.distance = distance; followTarget.height = height; followTarget.damping = damping; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值