求教,人物控制,视角随unity 鼠标控制视角移动,且绕角色旋转

一直很喜欢仙剑系列游戏,觉得仙剑的人物控制也很顺手,学习了Unity后就很想做一个类似于仙剑的人物控制方案。
又特地重玩了仙剑三,现将仙剑三的人物控制操作罗列如下:
键盘A:面向Y轴的顺时针旋转镜头,观察人物;(我这里的面向Y轴,就是指的从上向下看)
键盘D:面向Y轴的逆时针旋转镜头,观察人物;
键盘↑、↓、←、→:前后左右移动人物(需要注意的是:这里的前后左右是相对于镜头当前朝向方向的前后左右,其实就是在镜头所在的坐标轴下进行移动)
双击上述按键:跑
鼠标滚轴顺时针滚动(从鼠标右侧观察的顺时针):效果等同键盘A;
鼠标滚轴逆时针滚动(从鼠标右侧观察的逆时针):效果等同键盘D;
鼠标左键单击:地图选点人物向选点走动;
鼠标左键双击:地图选点人物向选点跑动;
我对于以上操作做了如下改动:
1.定义W/D来控制镜头向下和镜头向上转;
2.用Shitf来代替键盘双击与鼠标双击进行的跑动控制
3.代码中只考虑人物在X-Z轴平面上的移动,也就是说,人物只会绕着Y轴进行旋转
以下是两部分的代码,所有需要注意的内容都在注释中也明了。
绑定到mainCamera上的代码:
using UnityE
using System.C
public class mainCameraForXianjian : MonoBehaviour {
//游戏对象-主角色
private GameObject target =
//镜头距离主角的距离
public float distance = 2.0f;
//纵向最大观察角度(相当于限定了俯视的最大角度)
private float maxAngleInXAxis = 80;
//纵向最小观察角度(相当于限定了仰视的最大角度)
private float minAngleInXAxis = -20;
//横向镜头角度
private float x = 0;
//纵向镜头角度
private float y = 0;
// Use this for initialization
void Start () {
//查找主角
target = GameObject.Find (&rule&);
if (target == null) {
//初始化镜头角度
x = target.transform.eulerAngles.y;
y = target.transform.eulerAngles.x;
// Update is called once per frame
void LateUpdate () {
if (target == null) {
//定义:Ctrl + 鼠标滚轴 为调整镜头距主角距离(从鼠标右侧观察鼠标,滚轴顺时针拉近镜头,滚轴逆时针拉远镜头)
if (Input.GetKey (KeyCode.LeftControl) || Input.GetKey (KeyCode.RightControl)) {
distance -= Input.GetAxis (&Mouse ScrollWheel&) * 2.0f;//从鼠标右侧观察鼠标,滚轴顺时针值为正,逆时针值为负,之所以“-=”就是想顺时针拉近镜头
//x -= Input.GetAxis (&Mouse X&) * 4.0f;
//y += Input.GetAxis (&Mouse Y&) * 1.5f;
//定义:DirectikonHorizontal为方向横向输入量,W/A/S/D分别代表镜头绕着角色看角色上面、左边、下面、右边
x -= Input.GetAxis (&DirectionHorizontal&);
y -= Input.GetAxis (&DirectionVertical&);
//定义:鼠标滚轴,为从鼠标右侧观察鼠标,滚轴顺时针绕着角色观察角色左边
if (!Input.GetKey (KeyCode.LeftControl) && !Input.GetKey (KeyCode.RightControl)) {
x += Input.GetAxis (&Mouse ScrollWheel&) * 10;
//限定纵向观察角色的视觉范围
y = ClaimValue(y, maxAngleInXAxis, minAngleInXAxis);
Quaternion rotation = Quaternion.Euler(new Vector3 (y, x, 0));
//计算镜头最新位置
Vector3 position = Quaternion.Euler (y, x, 0) * (new Vector3 (0, 0, -distance)) + target.transform.
gameObject.transform.rotation =
gameObject.transform.position =
float ClaimValue(float value, float maxValue, float minValue)
if (value & -360) {
value += 360;
if (value & 360) {
value -= 360;
return Mathf.Clamp (value, minValue, maxValue);
绑定在主角上的代码:
using UnityE
using System.C
public class NewBehaviourScript : MonoBehaviour {
//角色移动方向
public const int HERO_UP = 0;
public const int HERO_RIGHT = 1;
public const int HERO_DOWN = 2;
public const int HERO_LEFT = 3;
public int state = 0;
//角色跑动时的速度
public int runSpeed = 15;
//角色走动时的速度
public int moveSpeed = 10;
//当前角色移动速度(默认为走动)
private int curSpeed = 10;
//当前角色动画名称
private string animState = &walk&;
//当前角色是否在进行鼠标点选移动
private bool bMouseMove =
//鼠标点选的目标位置
private Vector3 targetPos = Vector3.
public void Awake()
state = HERO_UP;
// Use this for initialization
void Start () {
// Update is called once per frame
void Update () {
//定义:Shift 代表移动模式为run
if (Input.GetKey (KeyCode.LeftShift) || Input.GetKey (KeyCode.RightShift)) {
animState = &run&;
curSpeed = runS
animState = &walk&;
curSpeed = moveS
/*******************************************************************************************/
/**********************************鼠标点选移动模式*******************************************/
//鼠标左键:角色向鼠标指向位置移动
if (Input.GetMouseButton(0)) {
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (Physics.Raycast (ray, out hit)) {
//设置当前为鼠标点选移动模式
bMouseMove =
targetPos = new Vector3 (hit.point.x, gameObject.transform.position.y, hit.point.z);
//调整角色面向目的地
gameObject.transform.LookAt (targetPos);
//在鼠标点选移动模式下,角色不停地向目的地前进
if (bMouseMove) {
//播放动画
gameObject.GetComponent&Animation& ().Play (animState);
//如果角色临界目的地,则移动角色到目的地,并停止移动
if ((Vector3.Distance (gameObject.transform.position, targetPos)) &= curSpeed * Time.deltaTime) { //Vector3.Distance(gameObject.transform.position, targetPos) & (float)curSpeed
gameObject.transform.position = targetP
bMouseMove =
//由于人物方向已经确定好了,所以以自身坐标系向目的地前进
gameObject.transform.Translate (Vector3.forward * curSpeed * Time.deltaTime, Space.Self);
/*******************************************************************************************/
/**********************************键盘移动模式**********************************************/
//定义:MoveVertical为UP/DOWN键;MoveHorizontal为RIGHT/LEFT键
float KeyVertical = Input.GetAxis (&MoveVertical&);
float KeyHorizontal = Input.GetAxis (&MoveHorizontal&);
if (KeyVertical == 1) {
setHeroState (HERO_DOWN);
} else if (KeyVertical == -1) {
setHeroState(HERO_UP);
if (KeyHorizontal == 1) {
setHeroState (HERO_RIGHT);
} else if (KeyHorizontal == -1) {
setHeroState(HERO_LEFT);
if ((KeyVertical == 0 && KeyHorizontal == 0) && !bMouseMove) {
gameObject.GetComponent&Animation&().Play ();
//控制角色移动一次
public void setHeroState(int newState)
bMouseMove =
//gameObject.transform.rotation = Quaternion.Euler(0, Camera.main.transform.eulerAngles.y, 0) ;
gameObject.transform.rotation = Quaternion.Euler(0, Camera.main.transform.eulerAngles.y + (int)newState * 90, 0) ;
int rotateValue = 0;
Vector3 transformValue = new Vector3 ();
gameObject.GetComponent&Animation& ().Play (animState);
//获取当前镜头的欧拉角
Vector3 newVector3 = Camera.main.transform.rotation.eulerA
//将欧拉角的x/z置空,因为这里只考虑角色在Y轴上的旋转
newVector3.x = 0;
newVector3.z = 0;
//将角色旋转的欧拉角转换为四元数,以便对目标向量进行旋转
Quaternion quter = Quaternion.Euler (newVector3);
switch (newState) {
case HERO_UP:
//quter乘以Vector3.forward的目的是:将角色行进方向旋转到镜头的方向
transformValue = quter * Vector3.forward * Time.deltaT
//rotateValue = 0;
case HERO_DOWN:
transformValue = quter * (-Vector3.forward) * Time.deltaT
//rotateValue = 180;
case HERO_LEFT:
transformValue = quter * Vector3.left * Time.deltaT
//rotateValue = 270;
case HERO_RIGHT:
transformValue = quter * (-Vector3.left) * Time.deltaT
//rotateValue = 90;
/* 我当是本来想用以下这部分代码的,但是由于通过Camera.main.transform.TransformDirection得到的方向中还可能含有沿X/Z轴的旋转量还需要处理,比较麻烦
* 简单来说,举个例子:如果镜头是在X轴上有个30度的旋转量,那么当控制人物向前走的时候,人物就会向前下方30°走
switch (newState) {
case HERO_UP:
//quter乘以Vector3.forward的目的是:将角色行进方向旋转到镜头的方向
transformValue = Camera.main.transform.TransformDirection(Vector3.forward) *
Time.deltaT
//rotateValue = 0;
case HERO_DOWN:
transformValue = Camera.main.transform.TransformDirection(-Vector3.forward) *
Time.deltaT
//rotateValue = 180;
case HERO_LEFT:
transformValue = Camera.main.transform.TransformDirection(Vector3.left) *
Time.deltaT
//rotateValue = 270;
case HERO_RIGHT:
transformValue = Camera.main.transform.TransformDirection(-Vector3.left) *
Time.deltaT
//rotateValue = 90;
//gameObject.GetComponent&Transform& ().Rotate (Vector3.up, rotateValue);
//将角色在指定方向在世界坐标下位移
gameObject.GetComponent&Transform& ().Translate (transformValue * curSpeed, Space.World);
state = newS
本文已收录于以下专栏:
相关文章推荐
在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式的小地图更多精彩请关注【狗刨学习网】,如果结合GUI在这个小地图下面绘制一些背景贴图,相信整体的效果会更好一些。博主希望这个问题大...
大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。
        在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式...
大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。
         在前面的文章中,我们分别实现了一个自定义的角色控制器《[Unity3D]U...
在3D游戏里面,视角是一个很重要的因素,部分玩家对锁视角嗤之以鼻,因此视角也是游戏制作里面需要努力的方面。其实也不难,换到Unity3D里面是想办法控制摄像机的移动。下面举一个简单的例子说明在Unit...
写在前面:由于本人是初学unity,对其中的部分机制理解还不够深,这篇文章的主要目的是记录我的开发过程,同时向读者们征求更好的解决方法。
上一次的鼠标点击移动的文章出了一点bug所以并不完全,...
using UnityE
using System.Cpublic class PlayerControl : MonoBehaviour
[HideIn...
更多精彩图书尽在---逐浪原创文学 ()               最新章节 (//index.html)  ...
单机游戏仙剑一直是特别喜欢玩的游戏,仙妖神鬼传说的背景,武侠和仙侠的题材,炫彩华丽的技能,悦耳的音乐,真的很不错!
意外有幸看到了一篇技术文章,转载学习 。哈 ,原文章地址:http://www.c...
今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能该文章出自【狗刨学习网】,通过鼠标点击屏幕来控制人物的走动。首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维...
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)【求助】怎么用鼠标转动摄像机的视角【ae吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:443,982贴子:
【求助】怎么用鼠标转动摄像机的视角收藏
不是直接改参数的方式,我怎么弄都是移动图层怎么破!!!
达内ae培训,分享ae名企实训案例,设计软件全面培训,0基础,120天速成ae高级设计师!
求大神-----来自圣休亚瑞的卫斯马屈
将图层转为3D,新建摄像机层,然后用轨道摄像机工具
建立摄像机之后,快捷键c就看到了
点击一下摄像机然后试一下鼠标的左键 滚轮
会有你要的
前提是3D的
登录百度帐号推荐应用下面的类主要作用是根据不同的值来改变摄像头的位置,从而达到不同的视角满足各种不同的需求,基本原理:角度的4元数乘以一个位移向量,得到一个旋转过后的最终向量,然后把最终向量赋值给摄像头,就得到摄像头的位置。还是看DEMO吧。
可以按下鼠标右键来操作angleX、angleY 的值,达到操作摄像头围绕着正方形X轴旋转,Y轴旋转。
根据绕x、y、z轴的旋转得到摄像头的旋转。
根据向量的x、y、z的值来确定上下左右坐标。
还有旋转速度 以及鼠标滚轮缩放的速度设置。
自己操作一下DEMO,再看看代码,什么都明白了。其实核心的东西就是 UpdateCarema 这个方法。
This movie requires Flash Player 9
CameraControl.cs
using UnityE
using System.C
//如果要贴代码自己建立项目,请先创建一个CUBE,
//并且将CUBE放大3倍(当然可以根据你的喜好自己调节大小。我DEMO的大小是3倍),
//然后将代码挂到摄像机上就可以运行了。切记要挂到摄像机上。
public class CameraControl : MonoBehaviour
// 观测对象
private GameO
public float distanceX = 0f;
public float distanceY = 0f;
public float distanceZ = -5f;
public float maxDistance = -50f;
public float minDistance = -5f;
public float angleX = 30f;
public float angleY = 0f;
public float angleZ = 0f;
public float anglespeed = 5f;
public float scrollSpeed = 250f;
void Start()
target = GameObject.Find("Cube");
void Update()
UpdateCarema();
void OnGUI()
float y = 0;
float dis = 20;
GUI.Label(new Rect(0, 0, 90, 30), "distanceX : ");
distanceX = GUI.HorizontalSlider(new Rect(90, 0, 100, 10), distanceX, -30.0F, 30.0F);
text = GUI.TextField(new Rect(190, 0, 50, 20), distanceX.ToString(), 6);
distanceX = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "distanceY : ");
distanceY = GUI.HorizontalSlider(new Rect(90, y, 100, 10), distanceY, -30.0F, 30.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), distanceY.ToString(), 6);
distanceY = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "distanceZ : ");
distanceZ = GUI.HorizontalSlider(new Rect(90, y, 100, 10), distanceZ, maxDistance, minDistance);
text = GUI.TextField(new Rect(190, y, 50, 20), distanceZ.ToString(), 6);
distanceZ = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "maxDistance : ");
maxDistance = GUI.HorizontalSlider(new Rect(90, y, 100, 10), maxDistance, -100, 100.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), maxDistance.ToString(), 6);
maxDistance = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "minDistance : ");
minDistance = GUI.HorizontalSlider(new Rect(90, y, 100, 10), minDistance, -100, 100.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), minDistance.ToString(), 6);
minDistance = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "angleX : ");
angleX = GUI.HorizontalSlider(new Rect(90, y, 100, 10), angleX, -360.0F, 360.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), angleX.ToString(), 6);
angleX = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "angleY : ");
angleY = GUI.HorizontalSlider(new Rect(90, y, 100, 10), angleY, -360.0F, 360.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), angleY.ToString(), 6);
angleY = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "angleZ : ");
angleZ = GUI.HorizontalSlider(new Rect(90, y, 100, 10), angleZ, -360.0F, 360.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), angleZ.ToString(), 6);
angleZ = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "speed : ");
anglespeed = GUI.HorizontalSlider(new Rect(90, y, 100, 10), anglespeed, 100.0F, 0.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), anglespeed.ToString(), 6);
anglespeed = float.Parse(text == "" ? "0" : text);
GUI.Label(new Rect(0, y, 90, 30), "scrollSpeed : ");
scrollSpeed = GUI.HorizontalSlider(new Rect(90, y, 100, 10), scrollSpeed, 500.0F, 0.0F);
text = GUI.TextField(new Rect(190, y, 50, 20), scrollSpeed.ToString(), 6);
scrollSpeed = float.Parse(text == "" ? "0" : text);
private void Mouse()
if (Input.GetMouseButton(1))
angleY += Input.GetAxis("Mouse X") *
angleX -= Input.GetAxis("Mouse Y") *
if (Input.GetAxis("Mouse ScrollWheel") != 0)
//根据鼠标滚轮都值计算出这一帧应该移动都距离。
distanceZ += Mathf.Lerp(0, Input.GetAxis("Mouse ScrollWheel") * scrollSpeed, Time.deltaTime);
//判断是否超过最大范围
distanceZ = Mathf.Clamp(distanceZ, maxDistance, minDistance);
private void UpdateCarema()
//通过围绕x、y、z轴都角度创建一个四元数
Quaternion rotation = Quaternion.Euler(angleX, angleY, angleZ);
//创建一个位移向量。
Vector3 Pos = new Vector3(distanceX, distanceY, distanceZ);
//将上面都向量选择对应四元数所表示都角度。
Vector3 move = rotation * P
//从目标点进行move向量的移动。得到一个新都位置。
Vector3 pos = move + target.transform.
//赋值给摄像机新的位置
transform.position =
//赋值给摄像机新都旋转
transform.rotation =
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
using UnityEngine;using System.Collections;//如果要贴代码自己建立项目,请先创建一个CUBE,//并且将CUBE放大3倍(当然可以根据你的喜好自己调节大小。我DEMO的大小是3倍),//然后将代码挂到摄像机上就可以运行了。切记要挂到摄像机上。public class CameraControl : MonoBehaviour{&&&&// 观测对象&&&&private GameObject target;&&&&&//距离&&&&public float distanceX = 0f;&&&&public float distanceY = 0f;&&&&public float distanceZ = -5f;&&&&public float maxDistance = -50f;&&&&public float minDistance = -5f;&&&&&//角度&&&&public float angleX = 30f;&&&&public float angleY = 0f;&&&&public float angleZ = 0f;&&&&public float anglespeed = 5f;&&&&public float scrollSpeed = 250f;&&&&&&&void Start()&&&&{&&&&&&&&target = GameObject.Find("Cube");&&&&}&&&&&void Update()&&&&{&&&&&&&&Mouse();&&&&&&&&&UpdateCarema();&&&&}&&&&&void OnGUI()&&&&{&&&&&&&&string text;&&&&&&&&float y = 0;&&&&&&&&float dis = 20;&&&&&&&&GUI.Label(new Rect(0, 0, 90, 30), "distanceX : ");&&&&&&&&distanceX = GUI.HorizontalSlider(new Rect(90, 0, 100, 10), distanceX, -30.0F, 30.0F);&&&&&&&&text = GUI.TextField(new Rect(190, 0, 50, 20), distanceX.ToString(), 6);&&&&&&&&distanceX = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "distanceY : ");&&&&&&&&distanceY = GUI.HorizontalSlider(new Rect(90, y, 100, 10), distanceY, -30.0F, 30.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), distanceY.ToString(), 6);&&&&&&&&distanceY = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "distanceZ : ");&&&&&&&&distanceZ = GUI.HorizontalSlider(new Rect(90, y, 100, 10), distanceZ, maxDistance, minDistance);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), distanceZ.ToString(), 6);&&&&&&&&distanceZ = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "maxDistance : ");&&&&&&&&maxDistance = GUI.HorizontalSlider(new Rect(90, y, 100, 10), maxDistance, -100, 100.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), maxDistance.ToString(), 6);&&&&&&&&maxDistance = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "minDistance : ");&&&&&&&&minDistance = GUI.HorizontalSlider(new Rect(90, y, 100, 10), minDistance, -100, 100.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), minDistance.ToString(), 6);&&&&&&&&minDistance = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "angleX : ");&&&&&&&&angleX = GUI.HorizontalSlider(new Rect(90, y, 100, 10), angleX, -360.0F, 360.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), angleX.ToString(), 6);&&&&&&&&angleX = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "angleY : ");&&&&&&&&angleY = GUI.HorizontalSlider(new Rect(90, y, 100, 10), angleY, -360.0F, 360.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), angleY.ToString(), 6);&&&&&&&&angleY = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "angleZ : ");&&&&&&&&angleZ = GUI.HorizontalSlider(new Rect(90, y, 100, 10), angleZ, -360.0F, 360.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), angleZ.ToString(), 6);&&&&&&&&angleZ = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "speed : ");&&&&&&&&anglespeed = GUI.HorizontalSlider(new Rect(90, y, 100, 10), anglespeed, 100.0F, 0.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), anglespeed.ToString(), 6);&&&&&&&&anglespeed = float.Parse(text == "" ? "0" : text);&&&&&&&&&y += dis;&&&&&&&&GUI.Label(new Rect(0, y, 90, 30), "scrollSpeed : ");&&&&&&&&scrollSpeed = GUI.HorizontalSlider(new Rect(90, y, 100, 10), scrollSpeed, 500.0F, 0.0F);&&&&&&&&text = GUI.TextField(new Rect(190, y, 50, 20), scrollSpeed.ToString(), 6);&&&&&&&&scrollSpeed = float.Parse(text == "" ? "0" : text);&&&&&}&&&&&private void Mouse()&&&&{&&&&&&&&if (Input.GetMouseButton(1))&&&&&&&&{&&&&&&&&&&&&angleY += Input.GetAxis("Mouse X") * anglespeed;&&&&&&&&&&&&angleX -= Input.GetAxis("Mouse Y") * anglespeed;&&&&&&&&}&&&&&&&&&if (Input.GetAxis("Mouse ScrollWheel") != 0)&&&&&&&&{&&&&&&&&&&&&//根据鼠标滚轮都值计算出这一帧应该移动都距离。&&&&&&&&&&&&distanceZ += Mathf.Lerp(0, Input.GetAxis("Mouse ScrollWheel") * scrollSpeed, Time.deltaTime);&&&&&&&&&&&&//判断是否超过最大范围&&&&&&&&&&&&distanceZ = Mathf.Clamp(distanceZ, maxDistance, minDistance);&&&&&&&&}&&&&}&&&&&&private void UpdateCarema()&&&&{&&&&&&&&//通过围绕x、y、z轴都角度创建一个四元数&&&&&&&&Quaternion rotation = Quaternion.Euler(angleX, angleY, angleZ);&&&&&&&&//创建一个位移向量。&&&&&&&&Vector3 Pos = new Vector3(distanceX, distanceY, distanceZ);&&&&&&&&//将上面都向量选择对应四元数所表示都角度。&&&&&&&&Vector3 move = rotation * Pos;&&&&&&&&//从目标点进行move向量的移动。得到一个新都位置。&&&&&&&&Vector3 pos = move + target.transform.position;&&&&&&&&&//赋值给摄像机新的位置&&&&&&&&transform.position = pos;&&&&&&&&//赋值给摄像机新都旋转&&&&&&&&transform.rotation = rotation;&&&&&}}
目前对向量、点、角度的一些概念在Unity中的使用还是不熟悉。Unity还在入门阶段。

我要回帖

更多关于 gta3鼠标不能控制视角 的文章

 

随机推荐