Unity3D中摄像机跟随方法借鉴大神,仅作为笔记用

1.第一种方法
摄像机视角锁死方法,具体做法就是事先调试好视角,然后聚焦,然后用代码事先固定视角,其代码如下:

/  挂载对象:主相机
// 功能:相机跟随人物
// 注意:相机只能跟随人物移动,但是如果人物转向或者做某些动作,摄像机并不跟随
using UnityEngine;
using System.Collections;
public class CameraShareScript : MonoBehaviour
{
        //摄像机于要跟随物体的距离
         Vector3 Dir;
//要跟随的物体
public  GameObject m_Player;
// Use this for initialization
void Start ()
       {
//获取到摄像机于要跟随物体之间的距离
Dir = m_Player.transform.position - transform.position;
}

// Update is called once per frame
void LateUpdate ()
{
//摄像机的位置
transform.position = m_Player.transform.position - Dir;
        }
}

优点:代码简单,但是不能跟随人物旋转,运动。

2.第二种方法:
这种方法是上种方法的优化,可以实现跟随人物移动,跟随人物旋转等基本功能,但是缺点是如果添加刚体组件,摄像机无法穿墙跟随人物,其代码如下:
//  挂载对象:主相机
// 功能:把要跟随的人物Tag修改为Player
// 注意:
using UnityEngine;
using System.Collections;


public class CameraFindPlayerScript : MonoBehaviour
{
//相机距离人物高度
float m_Height = 5f;
//相机距离人物距离
float m_Distance = 5f;
//相机跟随速度
float m_Speed = 4f;
//目标位置
Vector3 m_TargetPosition;
//要跟随的人物
Transform follow;
// Use this for initialization
void Start ()
{
// 通过Tag得到这个要跟随的人物
follow = GameObject.FindWithTag ("Player").transform;
}

// Update is called once per frame
//相机平滑的跟随人物移动
void LateUpdate ()
{
//得到这个目标位置
m_TargetPosition = follow.position + Vector3.up * m_Height - follow.forward * m_Distance;
//相机位置
transform.position = Vector3.Lerp (transform.position, m_TargetPosition, m_Speed * Time.deltaTime);
//相机时刻看着人物
transform.LookAt (follow);


}
}

基本实现相机时刻跟随人物移动,方便快捷。

3.第三种方法
第三种方法:射线检测,保证不论主角在哪摄像机永远可以看到主角,并且把摄像机的y轴和z轴锁死,使玩家视野不晕
using UnityEngine;
using System.Collections;
/// <summary>
/// Camera move.
/// 挂载对象:摄像机
/// 作用:摄像机跟随人物
/// </summary>
public class CameraMove : MonoBehaviour
{
//摄像机的移动速度
public float moveSpeed = 3f;
//摄像机的旋转速度
public  float turnSpeed = 10f;
//定义私有玩家
private Transform m_Player;
//摄像机与玩家之间的初始偏移量
private Vector3 offset;
//射线的碰撞信息
private RaycastHit hit;
//摄像机与玩家之间的距离
private float distance;
//摄像机的观察点
private Vector3[] currentPoints;
//通过Awake拿到自身的组件
void Awake ()
{
//通过tag找到人物组件
m_Player = GameObject.FindWithTag (TagsScript.Player).transform;
//定义一个v3类型的数组,里面有5个元素
currentPoints = new Vector3[5];
}
//初始化游戏对象
void Start ()
{
//游戏开始时摄像机与玩家之间的距离
distance = Vector3.Distance (transform.position, m_Player.position);
//摄像机指向玩家
//玩家与摄像机之间的偏移量
offset = m_Player.position - transform.position;
}


//物理引擎相关的放到FixedUpdate中
//LateUpdate可以避免卡顿
void LateUpdate ()
{
//摄像机观察的第一个点
Vector3 startPosition = m_Player.position - offset;
//摄像机的最后一个点
Vector3 endPosition = m_Player.position + Vector3.up * distance;
//把摄像机的五个观察点放到数组中,并且1,2,3三个观察点使用线性插值让摄像机平滑移动Slerp
currentPoints [1] = Vector3.Slerp (startPosition, endPosition, 0.25f);
currentPoints [2] = Vector3.Slerp (startPosition, endPosition, 0.5f);
currentPoints [3] = Vector3.Slerp (startPosition, endPosition, 0.75f);
currentPoints [0] = startPosition;
currentPoints [4] = endPosition;
//定义一个变量用来存储固定帧可以看到玩家的观察点
//viewposition = currentPoints [0]
Vector3 viewposition = currentPoints [0];
//for循环遍历这些点,如果找到最合适的点就把那个当前点赋值给可以看到玩家的观察点CheckView检测某个点能否看到玩家
for (int i = 0; i < currentPoints.Length; i++) {
//如果检测到某个点可以看到玩家
if (CheckView (currentPoints [i])) {
//把这个当前点赋值给viewposition
viewposition = currentPoints [i];
//之后返回不在继续遍历
break;
}
}
//把摄像机移动到观察点
transform.position = Vector3.Lerp (transform.position, viewposition, Time.deltaTime * moveSpeed);
//调用摄像机旋转方法
SmoothRotate ();
}
/// <summary>
/// Checks the view.
/// 检测某个点是否可以看到玩家
/// </summary>
/// <returns><c>true</c>, if view was checked, <c>false</c> otherwise.</returns>
/// <param name="pos">Position.</param>
//检测某个点能否看到玩家的方法bool类型
bool CheckView (Vector3 pos)
{
//定义玩家与观察点之间的方向向量
Vector3 dir = m_Player.position - pos;
//发射射线
if (Physics.Raycast (pos, dir, out hit)) {
//如果射线打到玩家
if (hit.collider.tag == TagsScript.Player) {
//返回true
return true;
}
}
//不然返回false
return false;
}
/// <summary>
/// Smooths the rotate.
/// 摄像机旋转的方法
/// </summary>
/// 摄像机旋转的方法
void SmoothRotate ()
{
//指向起始位置
//摄像机到玩家的向量
Vector3 m_Dir = m_Player.position - transform.position;
//要旋转的角度
Quaternion qua = Quaternion.LookRotation (m_Dir);
transform.rotation = Quaternion.Lerp (transform.rotation, qua, Time.deltaTime * turnSpeed);
//把摄像机x,y轴锁死
transform.eulerAngles = new Vector3 (transform.eulerAngles.x, 0, 0);

}
}

此种方法的好处非常多,可以检测遮挡物,并且不论人物在哪里都可以看到人物。  



原文地址:https://www.cnblogs.com/Damon-3707/p/11325824.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先