专栏首页韩东吉的Unity杂货铺零基础入门 34:摄像机跟随目标

零基础入门 34:摄像机跟随目标

hello,今天来抽出时间给大家更新一发,之前有好多同学和我反馈说特别想要一个收藏贴可以分享如何制作摄像机追随目标,经过大家一而再再而三的催促,今天来给大家分享一下如何实现这个功能。

正题开始


很多时候我们都需要有一个摄像机来跟随着移动的目标,最好还可以调节一些参数来控制追随的速度,高度等等参数。

大家先来看一下下面的效果图吧

如上图所示,当人物向前移动的时候,摄像机可以跟随物体进行移动。

那如何实现摄像机追随呢?

我直接把全部代码贴出来

以上是代码图,下面是代码段

//Add by Jimin at 2017/11/8

using UnityEngine;

using System.Collections;

using UnityEngine.UI.Collections;

namespace CinemaDirector

{

public class CameraFollow : MonoBehaviour

{

#region Public Attributes

[Tooltip("要控制移动的摄像机")]

public Camera m_camera;

[Tooltip("摄像机要跟随的目标")]

public GameObject m_target;

[Tooltip("摄像机的旋转角度")]

public Vector3 m_cameraRotation;

[Tooltip("摄像机距离目标的距离")]

public float startingDistance = 11f;

[Tooltip("摄像机距离目标的高度")]

public float targetHeight = 1.0f;

[Tooltip("摄像机跟随速度")]

[Range(0,1)]

public float cameraMoveSpeed = 1f;

#endregion

#region Private Attributes

private GameObject m_currentTarget = null;

private Vector3 m_focusPosition;

private bool isCanUpdateCameraToTarget = false;

#endregion

#region Public Methods

#endregion

#region Unity Methods

public void Start()

{

if (m_camera != null && m_target != null)

{

m_currentTarget = m_target;

m_focusPosition = m_currentTarget.transform.position;

isCanUpdateCameraToTarget = true;

}

else

{

isCanUpdateCameraToTarget = false;

}

}

void Update()

{

if(isCanUpdateCameraToTarget)

{

m_focusPosition = m_currentTarget.transform.position;

Vector3 trm = m_camera.transform.rotation * Vector3.forward * startingDistance + new Vector3(0, -1 * targetHeight, 0);

Vector3 targetPos = m_focusPosition - trm;

Vector3 movespeed = (targetPos - m_camera.transform.position) * cameraMoveSpeed;

Vector3 targetMov = Vector3.zero;

targetMov = movespeed * Time.deltaTime;

Vector3 position = m_camera.transform.position + targetMov;

targetPos = Vector3.Lerp(m_camera.transform.position, targetPos, cameraMoveSpeed);

m_camera.transform.position = targetPos;

m_camera.transform.rotation = Quaternion.Euler (m_cameraRotation);

}

}

#endregion

#region Override Methods

#endregion

#region Private Methods

#endregion

#region Inner

#endregion

}

}

创建一个空脚本后,大家只要把我的代码复制粘贴进去即可。

之后我们把脚本放到场景的空对象上,将需要关联的对象拖动上去。如下图

因为我在Public定义的时候有ToolTip的定义,所以大家可以把鼠标放到字段定义即可看见我们的注释内容。当做一个小技巧告诉大家。

Camera就是我们要移动的摄像机

Target是我们要追随的目标

Camera Rotation是摄像机的旋转角度

StartingDistance是摄像机的起始距离

Target Height是摄像机距离目标的高度

Camera Move Speed是摄像机的追随速度

好了, 以上就是今天摄像机追随目标的功能实现,最后再看一次我们的效果图。

好了,今天的分享就到这里啦。

大家下期分享见哈~

本文分享自微信公众号 - 韩东吉的Unity杂货铺(DeveloperJimin),作者:Jimin

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-11-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从象棋到太极,领悟学习之道(前言)

    不知道有多少人了解过维茨金,也不知道有多少人看过他写的书。先借鉴网上对维茨金的个人描述,让大家先有个了解。

    韩东吉
  • 零基础入门 28:MessageBox的制作和使用

    上一篇分享了项目中的菊花loading如何制作和使用,这篇分析依然围绕项目实用功能组件介绍。

    韩东吉
  • 零基础入门 32:修改组件的位置.宽高.旋转.缩放

    已经不止一两个同学来问过我这个问题了,如何修改一个组件的位置啊,宽高啊,旋转啊,缩放啊之类的问题,鉴于好多同学都有这个疑问,我就单独把他抽出一个小分享内容列出来...

    韩东吉
  • 智能合约编程语言-solidity快速入门(下)

    在介绍区块及交易属性之前,我们需要先知道solidity中自带了一些全局变量和函数,这些变量和函数可以认为是solidity提供的API,这些 API 主要表现...

    端碗吹水
  • 随机产生字符串

    package test; import java.util.Random; /**  * 产生随机字符串 用途:验证码的产生  *   * @author...

    用户1220053
  • Java集合类详解

    上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollectio...

    Java团长
  • 对象的序列化和反序列化

    package com.serialize.utils; import java.io.ByteArrayInputStream; import java.i...

    用户1220053
  • Tomcat启动时加载本地证书出错的问题

    使用命令行工具keytool生成一个自我认证证书:(用户向别的用户/服务认证自己)

    Jerry Wang
  • Spring Boot应用部署到Tomcat中无法启动问题

    完事儿打完包以后, 放到我本地Tomcat上跑了跑,发现没问题。但是部署到服务器上的Tomcat以后, 发现无法启动,错误如下:

    凯哥Java
  • 九月初,终于稳了一波,可以放松一下了嘛 附面经

    最近几年的经历教会我一个道理,那就是,只要你努力,世界上没有什么事搞不砸的。——尼克·霍恩比

    牛客网

扫码关注云+社区

领取腾讯云代金券