(涉及角度范围限制、资源加载、预设体、屏幕坐标世界坐标互相转换)
//把主相机设置为FPS(空物体)的子物体,枪设置为主相机的字物体
public class FPS : MonoBehaviour {
public float speed;
//角度限制数值设置
public float MinimumX = -90;
public float MaximumX = 90;
//获取主相机
private Transform mCarmeraTransform;
//获取枪
private Transform mGunTransform;
//父物体旋转目标角度
private Quaternion mParentTargetRot;
//相机旋转目标角度
private Quaternion mCameraTargetRot;
//枪的旋转目标角度
private Quaternion mGunTargetRot;
// Use this for initialization
void Start () {
//隐藏光标
//Cursor.visible = false;
//用下标找子物体
mCarmeraTransform = transform.Find("Main Camera");
//mGunTransform = transform.GetChild(0);
//获取初始本地旋转角度
mParentTargetRot = transform.localRotation;
mCameraTargetRot = mCarmeraTransform.localRotation;
//mGunTargetRot = mGunTransform.localRotation;
}
// Update is called once per frame
void Update () {
//if (Input.GetKeyDown(KeyCode.Escape))
//{
// Cursor.visible = true;
//}
//直接调用方法
Move();
//旋转
float yRot = Input.GetAxis("Mouse X");
float xRot = Input.GetAxis("Mouse Y");
//获得物体旋转后的旋转角度
mParentTargetRot *= Quaternion.Euler(xRot, 0, 0);
mCameraTargetRot *= Quaternion.Euler(0, yRot, 0);
//mGunTargetRot *= Quaternion.Euler(0, yRot, 0);
//限制父物体角度移动范围
mParentTargetRot = ClampRotationAroundXAxis(mParentTargetRot);
//旋转设置为缓动
transform.localRotation = Quaternion.Slerp(transform.localRotation, mParentTargetRot, Time.deltaTime);
mCarmeraTransform.localRotation = Quaternion.Slerp(mCarmeraTransform.localRotation, mCameraTargetRot, Time.deltaTime);
//mGunTransform.localRotation = Quaternion.Slerp(mGunTransform.localRotation, mGunTargetRot, Time.deltaTime);
}
//使用WASD进行摄像机前后左右的位移
void Move(){
//位移
float hor = Input.GetAxis("Horizontal");
float ver = Input.GetAxis("Vertical");
transform.Translate(new Vector3(hor, 0, ver) * Time.deltaTime * speed);
}
//限制角度范围
Quaternion ClampRotationAroundXAxis(Quaternion q)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1.0f;
float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan(q.x);
angleX = Mathf.Clamp(angleX, MinimumX, MaximumX);
q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angleX);
return q;
}
}
//鼠标点击创建一个球
public class CreatBall : MonoBehaviour {
private GameObject ballPerfab;
private float z;
// Use this for initialization
void Start () {
ballPerfab = Resources.Load("Ball");
Transform plane = GameObject.Find("Plane").transform;
z = Camera.main.WorldToScreenPoint(plane.position).z;
}
// Update is called once per frame
void Update () {
//世界坐标 position
//本地坐标 localposition
//屏幕坐标 => 世界坐标 ScreenToWorld
//世界坐标 => 屏幕坐标 WorldToScreen
//视口坐标(0,1) 屏幕左下角为(0,0)
if (Input.GetMouseButtonDown(0))
{
Vector3 screenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, z);
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPoint);
GameObject ball = Instantiate(ballPerfab, worldPosition, Quaternion.identity);
}
}
}
unity 摄像头跟着鼠标移动_lwj_unity_模拟第一人称摄像机前后左右移动 摄像机随鼠标移动旋转 鼠标点击添加物体...