UNITY 2021.4.15 第一人称摄像机角度

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递增旋转角度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值