Unity3D中怎样让unity3d摄像机跟随随小球移动而不旋转

  1、如图,我们已经给小球添加了移动的脚本,小球是Sphere,现在想实现的是让摄像机MainCamera跟随小球一起运动。
  2、我们先来看看上面说的不可行的方法:如图,直接将"Main Camera"拖动到"Sphere"的子目录,即让摄像机成为小球的子物体,这样,两个对象就可以一起运动了,那么我们来看看到底可不可行。
  3、我们记录一开始两物体的位置,此时让小球向右移动,此时,我们从这个视角看去,的确是一起运动了,但是,这不是我们在游戏里面看到得视角,我们看到的是摄像机的视角。
  4、运行游戏后,我们可以看到,画面是"天旋地转"的。所以,这种方法对于自身还在运动的物体来时,是不可行的。那么下来我们说说正确的做法。
  正确的方法:
  1、 我们要实现的是让相机跟随物体一起移动,其实就是让相机和小球的相对位置不变即可。这里我们需要使用代码来控制两个对象之间的相对位置,使其保持不变。
  首先,在MainCamera里面创建一个C# 脚本。如图所示,点击MainCamera,在右边属性栏最下方,选择 AddComponent。然后,在弹出的选项里拉到最下方,选择NewScript,然后创建一个C#脚本,命名为 Move。此时可以看到,我们新添加的一个C#脚本。  最简单的一种就是先设置好摄像机跟物体的相对距离,
在脚本里就可以由物体的位置,跟相对距离,就可以求出摄像机的位置,
用插值的方法可以让摄像机平滑跟随。
1 public class CamFollow1 : MonoBehaviour
private Vector3
void Start()
offset = player.position - transform.
void Update()
transform.position = Vector3.Lerp(transform.position, player.position - offset,Time.deltaTime*5);
实现一种注视的效果,可以对rotation做下处理
void Update()
transform.position = Vector3.Lerp(transform.position, player.position - offset,Time.deltaTime*5);
Quaternion rotation = Quaternion.LookRotation(player.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation,Time.deltaTime*3f);
这样子,人物在走动的时候,摄像机就是一边注视着人物,一边跟着移动。
但是,当有墙体,或其他高大的物体遮挡住人物,
摄像机就无法看到人物,玩家自然也看不到,
在上面的基础上做更近一步的扩展
在人物头顶往下看,肯定可以看得到人物,
所以我们要做的就是把摄像机的位置向人物头顶去调整,直到可以看到人物。
1 using UnityE
2 using System.C
4 public class CamFollow3 : MonoBehaviour
private T//英雄位置
private Vector3 //摄像机和英雄相对位置
private float//距离
private Vector3[] points = new Vector3[5];//5个点作为摄像机位置的选择
private Vector3 targetP//筛选后的摄像机位置
void Awake()
player = GameObject.FindWithTag("Player").
offset = transform.position - player.
distance = offset.
void FixedUpdate()
//更新5个点的位置
points[0] = player.position +
points[4] = player.position + Vector3.up*
points[1] = Vector3.Lerp(points[0], points[4], 0.25f);
points[2] = Vector3.Lerp(points[0], points[4], 0.5f);
points[3] = Vector3.Lerp(points[0], points[4], 0.75f);
points[4] = Vector3.Lerp(points[0], points[4], 0.9f);
targetPos = FindCameraTarget();
AdjustCamera();
private Vector3 FindCameraTarget()
Vector3 result = points[points.Length - 1];//头顶位置
//从低到高遍历
for (int i = 0; i & points.L ++i)
if (IsHitPlayer(points[i], player.position))
result = points[i];
private RaycastH
/// &summary&
/// 从origin发射一条射线检测是否碰到player,
/// 碰到则表示摄像机在此位置可以看到player
/// &/summary&
/// &param name="origin"&&/param&
/// &param name="target"&&/param&
/// &returns&&/returns&
bool IsHitPlayer(Vector3 origin, Vector3 target)
bool result = false;
Vector3 dir = target -
ray = new Ray(origin,dir);
if (Physics.Raycast(ray, out hit))
if (hit.transform.tag == "Player")
result = true;
/// &summary&
/// 调整摄像机位置
/// &/summary&
void AdjustCamera()
transform.position = Vector3.Slerp(transform.position, targetPos, Time.deltaTime * 6);
Quaternion rotation = Quaternion.LookRotation(player.position - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * 33f);
阅读(...) 评论()游戏蛮牛学习群(纯技术交流,不闲聊):
扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
_____________________________________________________________________________________________________________
问答求助版块规则:
  1、问题尽量描述清楚
& && &2、代码要放在代码块里
& && &3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
& && &5、问题得到解决,请选择最佳答案。
& && &6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 2432|回复: 8
摄像机跟随物体的朝向,移动,旋转
72690/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 2690, 距离下一级还需 2310 积分
日久生情, 积分 2690, 距离下一级还需 2310 积分
蛮牛币1444
在线时间1026 小时
有个物体疯狂移动,转动。我要把摄像机放在物体前,现在试过成为这个物体子集,效果不理想,太晃动会晕,请问大神怎么让摄像机更随物体移动,旋转,而且体验感不晕眩?
每日推荐:
2139/150排名<font color="#FF昨日变化1主题帖子积分
初来乍到, 积分 139, 距离下一级还需 11 积分
初来乍到, 积分 139, 距离下一级还需 11 积分
在线时间57 小时
都给你解决了 还不给我币 ~~好无爱呀~~~
每日推荐:
61242/1500排名<font color="#FF昨日变化1主题帖子积分
蛮牛粉丝, 积分 1242, 距离下一级还需 258 积分
蛮牛粉丝, 积分 1242, 距离下一级还需 258 积分
蛮牛币2462
在线时间277 小时
既然你的物体是疯狂移动,转动的,而你的相机又是跟随物体的,那么画面也就是高速旋转移动的,正常人都会晕吧,除非你是开发出来给小彩旗玩的,她玩的话就不会晕。
如果想要正常人不晕的话,建议相机只要移动,不要旋转,然后代码控制相机位置相对物体位置就行了
每日推荐:
2139/150排名<font color="#FF昨日变化1主题帖子积分
初来乍到, 积分 139, 距离下一级还需 11 积分
初来乍到, 积分 139, 距离下一级还需 11 积分
在线时间57 小时
你说的不是很清楚
1 你想让你的物体随着物体的移动而移动并旋转,是让摄像机围绕着物体转?&&就用&&Quaternion.LookRotation();
2 如果是只让物体移动旋转 让摄像机就在后面跟着拍可以了& &&&还有刚才你说会眩晕 , 你可以把摄像机放到LeteUpdate()这个脚本里面&&还有要是你的物体用了RIG刚体你就 用FixedUpdate()
如果你就想让摄像机 跟随物体 屁股后面 而且带刚体的物理效果 八成是你代码写在 update()里面了&&那样 如果运行快了就是出现 眩晕 卡帧的行为~
&&赏点币呗 打字辛苦呀 ~
每日推荐:
72690/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 2690, 距离下一级还需 2310 积分
日久生情, 积分 2690, 距离下一级还需 2310 积分
蛮牛币1444
在线时间1026 小时
那不旋转, 就上下动呢?&&上下动的太猛了,怎么缓慢,体验感舒服点?
每日推荐:
5739/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 739, 距离下一级还需 261 积分
熟悉之中, 积分 739, 距离下一级还需 261 积分
蛮牛币1204
在线时间210 小时
官方自带资源包camera里的multipurpose摄像机完美解决&&这种脚本都是各种平滑&&可以参考下
每日推荐:
2139/150排名<font color="#FF昨日变化1主题帖子积分
初来乍到, 积分 139, 距离下一级还需 11 积分
初来乍到, 积分 139, 距离下一级还需 11 积分
在线时间57 小时
那不旋转, 就上下动呢?&&上下动的太猛了,怎么缓慢,体验感舒服点?
你想第一人称还是 第三人称?
&&第一人称&&就是相机 绑到人身上&&
&&第三人称就 还是绑到人生上 并且 把摄像机的距离和人物的距离设定好&&然后在每帧里面刷新保持相机和人物的距离 就可以了
&&当然 如果第三人称 你可以让你角色的头部&&LookAt(目标)&&那样更加生动一些&&~
我不知道你具体想要做出来什么效果& &很多细节方面我也不考虑~
每日推荐:
72215/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 2215, 距离下一级还需 2785 积分
日久生情, 积分 2215, 距离下一级还需 2785 积分
蛮牛币3177
在线时间943 小时
在更新摄像机位置/角度的时候,不要直接
localPosition = targetP
你的摄像机脚本设置一个变量,targetPosition, targetEulerAngles,然后在你的Update里用
localPosition = Mathf.Lerp (localPosition, targetPosition, 0.3f);
localEulerAngles = Mathf.Lerp (localEulerAngles, targetEulerAngles, 0.3f);
0.3 就是lerp 的量,你可以自己设置成其他 [0,1]的数& &设置成1就跟你现在的做法一样了
每日推荐:
72281/5000排名<font color="#FF昨日变化1主题帖子积分
日久生情, 积分 2281, 距离下一级还需 2719 积分
日久生情, 积分 2281, 距离下一级还需 2719 积分
蛮牛币8178
在线时间852 小时
既然你的物体是疯狂移动,转动的,而你的相机又是跟随物体的,那么画面也就是高速旋转移动的,正常人都会晕 ...
哈哈哈哈,特定人群,小彩旗
每日推荐:}

我要回帖

更多关于 unity 摄像机跟随脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信