unity3d摄像机跟随里照相机跟随鼠标左右移动的代码怎么写

& & & 游戏中,我们经常会有这样的操作,点击场景中某个位置,角色自动移动到那个位置,同时角色一直是朝向那个位置移动的,而且相机也会一直跟着角色移动。有些游戏,鼠标滑动屏幕,相机就会围绕角色旋转。
看似很简单的操作,那么到底是怎么实现的呢?
我们把上述操作分解为以下几个步骤
角色的移动
1. 移动到下一个路点,线性插值、
2. 角色朝向,一直面朝下一个路点
相机跟随角色
1. 相机俯视角度,决定相机的高度
2. 相机跟随距离,前向距离或者直线距离(就是三角形的水平边长或者斜边长)
3. 相机一直看角色的后背(Y轴旋转角度和角色一致)
4. 相机围绕角色旋转
先来看效果,请原谅我未注册屏幕录像orz
  包括位移和方向,就是移动角色的同时角色一直要朝向移动的方向。
左边的图,角色从A移动到B,朝向却一直是向前方的,明显不符合跑动的显示逻辑。正确的表现是右图所展示那样,角色面朝移动方向。
那么我们要怎么做才能实现这个效果呢?位移很简单,A到B的坐标插值。
其次是旋转角色,Unity提供了一个方法Quaternion.LookRotation。关于这个方法,官方的解释如下:
.LookRotation 注视旋转
static function LookRotation (forward : Vector3, upwards : Vector3 = Vector3.up) : Quaternion
Description描述
Creates a rotation that looks along forward with the the head upwards along upwards
创建一个旋转,沿着forward(z轴)并且头部沿着upwards(y轴)的约束注视。也就是建立一个旋转,使z轴朝向view
y轴朝向up。
Logs an error if the forward direction is zero.
如果forward方向是0,记录一个错误。
光看描述,是不是比较难理解。网上对这个方法的解释也挺多的,但是各说纷纭,没个简单明了的说法,更容易误导人。
我们知道向量,包含大小和方向。大小很容易得到,那么方向怎么获得呢?常规来说,可以通过把向量分解为x、y、z三个分量,然后通过三角函数依次求得个分量的夹角。
Unity提供了更简单的方法,就是Quaternion.LookRotation,这个方法就是获得传入向量的方向,即旋转值,是个四元数。
代码实际上很简单,就几行。主要是要理解为什么
<span style="color: #
//计算当前位置到下一个坐标点的向量
<span style="color: #
var vector = (posB - posA).
<span style="color: #
//取得向量的方向
<span style="color: #
var rotation = Quaternion.LookRotation(vector).eulerA
<span style="color: #
//将物体旋转到指向下一个坐标点的方向
<span style="color: #
transform.rotation = Quaternion.Euler(<span style="color: #, rotation.y, <span style="color: #);
<span style="color: #
//设置物体的坐标
<span style="color: #
transform.position = posB;
想想为什么Quaternion.Euler(0, rotation.y, 0)这里x和z方向都是填的0?
因为角色的朝向是根据偏转角Yaw,也就是Y轴决定的,x和z轴是没有发生偏转的,倘若改变x轴z轴旋转值,就会发现角色会有俯仰、翻滚的效果。
相机跟随角色
好了,角色的朝向解决了。那么,如果我要让相机一直跟着角色走,同时相机一直看到角色的后背,也就是角色旋转时,相机要跟着转动,同时保持固定距离,该如何实现?
我们先计算相机的位置,然后在旋转相机朝向角色的后背。
1. 计算相机的旋转值,这里需要指定相机的俯仰角Pitch的值,假定是30度,可以根据具体情况调节
//相机的俯仰角和偏航角,Y方向偏航和目标对象一致
Quaternion ro = Quaternion.Euler(Pitch, transform.rotation.eulerAngles.y, <span style="color: #);
2. 计算指定长度Distance的向量,这个向量是与世界坐标z方向平行
var vector = Vector3.forward * Distance;
3. 用上面的相机旋转值左乘第二步得到的向量,改变这个向量的方向( 四元数左乘向量,改变向量的方向)
= ro * vector;
4. 用目标位置减去vector,得到指向目标位置的坐标点,也就是相机的最终位置。(为什么这样就得到位置了,回去看看向量的知识吧)
var pos = transform.position -&
5. 最后,将旋转值和坐标赋值给相机,相机就完成了跟随效果, 是不是很简单
CameraGo.transform.position =
CameraGo.transform.rotation =
<span style="color: # //相机的俯仰角和偏航角,Y方向偏航和目标对象一致
<span style="color: # Quaternion ro = Quaternion.Euler(Pitch, transform.rotation.eulerAngles.y, <span style="color: #);
<span style="color: # //给向量赋予旋转
<span style="color: # var distanceVector = ro * Vector3.forward * D
<span style="color: # var pos = transform.position - distanceV
<span style="color: # CameraGo.transform.position =
<span style="color: # CameraGo.transform.rotation =
至于相机围绕角色旋转,我们只需要改变一下Quaternion.Euler(Pitch,&transform.rotation.eulerAngles.y,&0) 中transform.rotation.eulerAngles.y这个值
本来这个值是指定相机朝向角色的方向,我们改变这个值,就可以实现相机围绕角色的效果。我们可以这样做
//delta就是围绕角色旋转的旋转角度0~360.
Quaternion ro = Quaternion.Euler(Pitch, transform.rotation.eulerAngles.y + delta, <span style="color: #)
最终,上诉代码如下,代码不完整,请各位自行补全:
1      //角色移动
void SmoothMove()
Vector3[] vector3s = _transDataL// CurvePath.PathControlPointGenerator(_transDataList);
int sample = _transDataList.Length * SampleR
_movePtg += Time.deltaTime * MoveS
//曲线插值
<span style="color: #
transform.position = CurvePath.Interp(vector3s, _movePtg / sample);
<span style="color: #
<span style="color: #
//计算当前位置到下一个坐标点的向量
<span style="color: #
var vector = (transform.position - _prevPos).
<span style="color: #
//取得向量的方向
<span style="color: #
var rotation = Quaternion.LookRotation(vector, Vector3.right).eulerA
<span style="color: #
//去处x和z方向的影响,仅作用y方向偏转
<span style="color: #
rotation.x = <span style="color: #;
<span style="color: #
rotation.z = <span style="color: #;
<span style="color: #
<span style="color: #
//将物体旋转到指向下一个坐标点的方向
<span style="color: #
transform.rotation = Quaternion.Euler(rotation);
<span style="color: #
<span style="color: #
<span style="color: #
_prevPos = transform.
<span style="color: #
if (_movePtg &= sample)
<span style="color: #
<span style="color: #
ResetLocalData();
<span style="color: #
<span style="color: #
<span style="color: #
<span style="color: #
//相机跟随
<span style="color: #
void FollowCamera()
<span style="color: #
<span style="color: #
if (CameraGo == null) return;
<span style="color: #
<span style="color: #
if(UseFollow != <span style="color: #)
<span style="color: #
<span style="color: #
//相机的俯仰角和偏航角,Y方向偏航和目标对象一致
<span style="color: #
Quaternion ro = Quaternion.Euler(Pitch, transform.rotation.eulerAngles.y + Slider, <span style="color: #);
<span style="color: #
<span style="color: #
//给向量赋予旋转
<span style="color: #
var distanceVector = ro * Vector3.forward * D
<span style="color: #
var pos = transform.position - distanceV
<span style="color: #
CameraGo.transform.position =
<span style="color: #
CameraGo.transform.rotation =
<span style="color: #
<span style="color: #
<span style="color: #
阅读(...) 评论()3878人阅读
unity(35)
摄像机跟随物体方法一是把摄像机设置为物体Player的子物体,给Player添加移动脚步就可以摄像机跟随Player移动。移动的简单脚步using UnityE
using System.C
//移动脚步
public class das : MonoBehaviour
//设置速度,值可以改动试试
private float speed = 10f;
void Start()
void Update()
//获取unity自带的移动W,A,S,D和上下左右键
float h = Input.GetAxis(&Horizontal&) * speed * Time.deltaT
float v = Input.GetAxis(&Vertical&) * speed * Time.deltaT
//移动物体,我现在是让物体的X,Y的坐标变化,transform.Translate(h, 0, v)是X,Z的坐标变化,这个根据移动要求可修改
transform.Translate(h, v, 0);
}这样就可以实现简单的摄像机跟随物体了,可是根据我的个人使用情况,我是很少使用,因为我觉得总是有点卡的感觉,不推荐使用。接下来用一下方法二:代码控制摄像机跟随物体。&/pre&&pre name=&code& class=&csharp&&using UnityE
using System.C
//脚本挂在摄像机上
public class FollowPlayer : MonoBehaviour
//定义一个Transform类型的player
//定义摄像机与人物的偏移位置
private Vector3 offsetS
//在Awake里获取到移动物体Player的transform组件,其实也是初始化定义的字段
void Awake()
//得到组件,先是给Player设置个Tag,当然也可以用Find来找Player名的方式,下面;但是不建议使用。
// player = GameObject.Find(&Player&).
player = GameObject.FindGameObjectWithTag(&Role&).
//让摄像机朝向人物的位置
transform.LookAt(player.position);
//得到偏移量
offsetStation = transform.position - player.
void Update()
//让摄像机的位置= 人物行走的位置+与偏移量的相加
transform.position = offsetStation + player.
这样摄像机就可以跟随物体Player移动了。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23379次
排名:千里之外
原创:36篇
(1)(1)(4)(4)(1)(3)(2)(5)(24)Unity3d&镜头跟随角色移动时的效果_天才骆_新浪博客
Unity3d&镜头跟随角色移动时的效果
很多游戏在玩家角色移动的时候镜头也会跟着移动,这样就很自然的想到直接在角色的坐标变化的时候就将角色坐标赋给摄像机(当然要有一些偏移),但是开发过程中发现如果直接这样的话位置过度不太自然,会让玩家觉得一卡一卡的,看了一些游戏的源码demo发现有些是用动作的过度效果去掩盖这种不好的体验,可是还是会让玩家觉得不太流畅(单机),后来发现有的实现位置变化是用Vector3.Lerp,这能让位置过度更加平滑。这就是Unity的弹簧一样的过度效果。
代码如下:
(将代码脚本挂在摄像机下就可以)
using UnityE
using System.C
public class FollowTarget : MonoBehaviour {
&&& public
&&& private
Transform playerB
&&& public float
smoothing = 1;
&&& // Use this
for initialization
playerBip =
GameObject.FindGameObjectWithTag("Player").transform.Find("Role");
&&& // Update is
called once per frame
FixedUpdate()
//transform.position = playerBip.position +
Vector3 targetPos = playerBip.position +
transform.position = Vector3.Lerp(transform.position, targetPos,
smoothing * Time.deltaTime);
博客等级:
博客积分:0
博客访问:3,134
关注人气:0
荣誉徽章:【新人求助】如何让摄像头在平面内跟随鼠标的滑动而移动【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:70,365贴子:
【新人求助】如何让摄像头在平面内跟随鼠标的滑动而移动收藏
RT,如何让摄像头在平面内跟随鼠标的滑动而移动,需要写个什么脚本吗?
UI视觉,原画,插画,影视动画,VR/AR,影视后期,游戏特效,游戏设计
用射线检测地面读取坐标,再让摄像机看着这点。
屏幕坐标要转成世界坐标才行!百度上有!!
就没个能详细点的吗?copy一个也可以啊
小伙子,只有60行代码。
上面是我当年的学习笔记。
突然发现发错代码了
我自己写的一个例子,你应该能用using UnityEusing System.Cpublic class MoveCamera : MonoBehaviour {public int cameraMoveSpeed = 10;//相机移动速度float originalPositionX;//相机初始的横坐标位置public int moveRank = 1;//移动段数,例子:有两个boss就是可以移动一段距离public int moveDistance = 5;//每段移动的距离void Start(){originalPositionX = this.transform.position.x;}void OnGUI() {if(Event.current.type == EventType.mouseDrag){//x=Input.GetAxis(&Mouse X&);//y=Input.GetAxis(&Mouse Y&);//移动距离限制if(this.transform.position.x & originalPositionX){Vector3 pos = new Vector3( originalPositionX, this.transform.position.y, this.transform.position.z);this.transform.position =}else if(this.transform.position.x & originalPositionX + moveDistance * moveRank){Vector3 pos = new Vector3( originalPositionX + moveDistance * moveRank, this.transform.position.y, this.transform.position.z);this.transform.position =}else{transform.Translate(new Vector3(-x,0,0) * Time.deltaTime * cameraMoveSpeed);}}}}
LZ是什么意思,是指这样吗:现在场景里有个在高处的监视摄像头,然后它会瞄准鼠标所指的在场景中的点对吗
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

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

 

随机推荐