using UnityEngine;
using System.Collections;
public class Mouselook : MonoBehaviour {
public enum RotationAxes
{
mouseXAndY =0,
mouseX=1,
mouseY=2,
}
public RotationAxes axes = RotationAxes.mouseXAndY;
public float sensitivityHor = 9.0f;// public:共有的方法与属性,可被外用,而private:私有
public float sensitivityVert = 9.0f;
public float minimumVert =-45.0f;
public float maximumVert = 45.0f;
private float _rotationX = 0f;
// Use this for initialization
void Start () {
Rigidbody body = GetComponent<Rigidbody> ();
if (body != null)
body.freezeRotation = true;
}
// Update is called once per frame
void Update () {
if (axes == RotationAxes.mouseX) {//horizontal rotation 放置
//transform.Rotate(0,sensitivityHor,0);
transform.Rotate(0,Input.GetAxis("Mouse X")*sensitivityHor,0);
}
else if (axes == RotationAxes.mouseY) {//vertical rotation 放置
_rotationX -= Input.GetAxis("Mouse Y")*sensitivityVert;
_rotationX = Mathf.Clamp (_rotationX, minimumVert, maximumVert);
float rotationY = transform.localEulerAngles.y;
transform.localEulerAngles = new Vector3(_rotationX,rotationY,0);
}
else {
_rotationX -= Input.GetAxis ("Mouse Y") * sensitivityVert;
_rotationX = Mathf.Clamp (_rotationX, minimumVert, maximumVert);
float delta = Input.GetAxis ("Mouse X") * sensitivityHor;
float rotationY = transform.localEulerAngles.y + delta;
transform.localEulerAngles = new Vector3 (_rotationX, rotationY, 0);
}
}
}
关于rigidbody:主要是为了让玩家的旋转受鼠标控制而不受物理仿真影响
rigidbody是对象能拥有的一个额外组件。物理仿真作用与它并处理他们接触到的对象
如果freezeRotation被启用,旋转不会被物体模拟修改。这对于创建第一人称射击游戏时是很有用的,因为玩家需要使用鼠标完全控制旋转。
public RotationAxes axes = RotationAxes.mouseXAndY; :讲变量声明为共有,以便于编辑器中能对其进行设置
C#中Transform类的介绍
主要用于物体的旋转移动和缩放(不是原创只是作为笔记)
一、成员变量
position:在世界空间坐标transform的位置。
localPosition:相对于父级的变换的位置。如果该变换没有父级,那么等同于Transform.position。
eulerAngles:世界坐标系中的旋转(欧拉角)。
localEulerAngles:相对于父级的变换旋转角度。
right:世界坐标系中的右方向。(世界空间坐标变换的红色轴。也就是x轴。)
up:世界坐标系中的上方向。(在世界空间坐标变换的绿色轴。也就是y轴。)
forward:世界坐标系中的前方向。(在世界空间坐标变换的蓝色轴。也就是z轴。)
rotation:世界坐标系中的旋转(四元数)。
localRotation:相对于父级的变换旋转角度。
localScale:相对于父级的缩放比例。
parent:父对象Transform组件。
worldToLocalMatrix:矩阵变换的点从世界坐标转为自身坐标(只读)。
localToWorldMatrix:矩阵变换的点从自身坐标转为世界坐标(只读)。
root:对象层级关系中的根对象的Transform组件。
childCount:子对象数量。
lossyScale:全局缩放比例(只读)。
二、成员函数:
1、LookAt函数
public void LookAt(Transform target)
public void LookAt(Vector3 worldPosition);
public void LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);
public void LookAt(Transform target, Vector3 worldUp = Vector3.up);
旋转物体,使物体的z轴指向target/worldPosition,对于worldUp的描述是,在完成上面的旋转之后,继续旋转自身,使得当前对象的正y轴朝向与worldUp所指向的朝向一致。
这里的朝向一致指的是新旋转后的y轴与worldUp在该对象初次旋转后的xy平面上的投影向量一致。之所以取投影是因为第一次旋转使物体的z轴指向target/worldPosition后,此时的worldUp向量可能不在xy平面上,要在z轴指向target/worldPosition前提下是y轴朝向与worldUp一致,只能取worldUp在xy平面上的投影。
注意:使用worldPosition向量时要注意方向,一定是target-transform.position,顺序反了会使物体背向目标;若使用Transform作为参数,则不必注意。默认情况下,worldUp是Vector3.up(世界坐标系下的y轴)
2、Rotate函数
public void Rotate(Vector3 eulerAngles);
public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);
public void Rotate(float xAngle, float yAngle, float zAngle);
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
旋转一个欧拉角度,它按照zxy的顺序进行旋转,默认情况下局部坐标系下Space.Self
public void Rotate(Vector3 axis, float angle);
public void Rotate(Vector3 axis, float angle,Space relativeTo = Space.Self);
绕axis轴旋转angle角度,默认情况下局部坐标系下Space.Self。
transform.rotation和Rotate有个区别:
Rotate()方法是:旋转多少度。在原有的基础上累加,即旋转了多少角度。又旋转了多少角度,是在原有的基础上在旋转
rotation属性是:旋转到某个角度,就是是在update中每帧都执行。但每次旋转到的角度都是5,所以是旋转到5度。一直都是
比如你只想让他旋转到多少, 用rotation; 假如想让他一直转,可以用Rotate
rotation直接改变了数值, 以达到旋转效果
Rotate应用一个的旋转角度每秒1度慢慢的旋转物体
当然:rotation()还可以通过插值旋转
C#中的 -= 运算符:
C#中 -= 意思为:减法赋值运算符。表示该符号左右两边的值先进行-运算,得出两者的差,然后赋值给符号左边的变量。例如:a -= b, 等同于 a = a - b。
代码示例为:
INTVAL1 = 11
INTVAL2 = 10
INTVAL1 -= INTVAL2
最终运行结果为:INTVAL1 = 1, INTVAL2 = 10
Mathf.clamp:将旋转角度保持在了minimum,maxmum之间。如果说不加以限制(注释掉clamp那行),玩家甚至会倾斜到上下颠倒。
delta是变化量,而下一行则是使用delta递增旋转角度