直接把这个脚本挂在摄像机上就可:

using System.Collections;
using System.Collections.Generic;
using UnityEngine; /*
* 键盘鼠标位移和cs操作模式完全一致
* wsad四键 控制camera x和z轴方向位移
* 鼠标 控制camera角度旋转
*
* camera位移时受当时camera角度的影响
*/ public class MainCameraScript : MonoBehaviour { private float speed = 8.0f;
private float rotationSpeed = 4.0f;
private bool isKeyDown_W = false;
private bool isKeyDown_S = false;
private bool isKeyDown_A = false;
private bool isKeyDown_D = false;
//private bool isKeyDown_Space = false; //x轴旋转方向是反的,所以不能直接用当前欧拉角x去加
private float curRotationX = 0.0f; // Use this for initialization
void Start () {
float posX = gameObject.transform.position.x;
float posZ = gameObject.transform.position.z;
float posY = gameObject.transform.position.y;
Debug.Log("maincamera pos x is:" + posY);
Vector3 rotation = transform.eulerAngles;
Debug.Log("maincamera eulerAngles y is : " + rotation.y); Cursor.visible = false;
} // Update is called once per frame
void Update () {
mouseInput();
keyboardInput(); } private void mouseInput()
{
curRotationX = curRotationX + rotationSpeed * Input.GetAxis("Mouse Y");
float rotationY = transform.localEulerAngles.y + rotationSpeed * Input.GetAxis("Mouse X");
transform.localEulerAngles = new Vector3(-curRotationX, rotationY,0); Debug.Log("maincamera eulerAngles y is : " + transform.localEulerAngles.y);
} private void keyboardInput()
{
//Input.GetAxis 按键发生时的增量 最小-1最大1 //旋转
float rotation = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
//transform.Rotate(0, rotation, 0); //欧拉角 unity右侧inspector的transform的Rotation里显示的就是欧拉角数值
float eulerAnglesY = transform.eulerAngles.y;
//Debug.Log("eulerAnglesY is : " + eulerAnglesY.ToString());
//前进后退,旋转后会影响到前进后退的方向
if (Input.GetKeyDown(KeyCode.W))
{
Debug.Log("w key down");
isKeyDown_W = true;
//DispatchKeyboardEvent(KeyCode.W, isKeyDown_W);
}
else if (Input.GetKeyUp(KeyCode.W))
{
isKeyDown_W = false;
//DispatchKeyboardEvent(KeyCode.W, isKeyDown_W);
} if (Input.GetKeyDown(KeyCode.S))
{
Debug.Log("s key down");
isKeyDown_S = true;
//DispatchKeyboardEvent(KeyCode.S, isKeyDown_S);
}
else if (Input.GetKeyUp(KeyCode.S))
{
isKeyDown_S = false;
//DispatchKeyboardEvent(KeyCode.S, isKeyDown_S);
} if (Input.GetKeyDown(KeyCode.A))
{
isKeyDown_A = true;
//DispatchKeyboardEvent(KeyCode.A, isKeyDown_A); }
else if (Input.GetKeyUp(KeyCode.A))
{
isKeyDown_A = false;
//DispatchKeyboardEvent(KeyCode.A, isKeyDown_A);
} if (Input.GetKeyDown(KeyCode.D))
{
isKeyDown_D = true;
//DispatchKeyboardEvent(KeyCode.D, isKeyDown_D);
}
else if (Input.GetKeyUp(KeyCode.D))
{
isKeyDown_D = false;
//DispatchKeyboardEvent(KeyCode.D, isKeyDown_D);
} //if (Input.GetKeyDown(KeyCode.Space))
//{
// isKeyDown_Space = true;
//}
//else if (Input.GetKeyUp(KeyCode.Space))
//{
// isKeyDown_Space = false;
//} if (isKeyDown_W)
{
float dx = Mathf.Sin(eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
float dz = Mathf.Cos(eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
transform.position += new Vector3(dx, 0, dz);
} if (isKeyDown_S)
{
float dx = Mathf.Sin(eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
float dz = Mathf.Cos(eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
transform.position += new Vector3(dx, 0, dz);
} if(isKeyDown_A)
{ //eulerAnglesY不能直接用
float dx = Mathf.Cos(0-eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
float dz = Mathf.Sin(0-eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
transform.position += new Vector3(dx, 0, dz);
} if (isKeyDown_D)
{
float dx = Mathf.Cos(0-eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
float dz = Mathf.Sin(0-eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
transform.position += new Vector3(dx, 0, dz);
} //if (isKeyDown_Space)
//{
// float dy = speed * Time.deltaTime;
// transform.position += new Vector3(0, dy, 0);
//} }
}

  

让camera实现类似cs第一人称视角旋转和位移的更多相关文章

  1. unity中自制模拟第一人称视角

    public float sensitivityX = 5f; public float sensitivityY = 5f; public float sensitivetyKeyBoard = 0 ...

  2. 如何使用threejs实现第一人称视角的移动

    在数据可视化领域利用webgl来创建三维场景或VR已经越来越普遍,各种开发框架也应运而生.今天我们就通过最基本的threejs来完成第一人称视角的场景巡检功能.如果你是一位threejs的初学者或正打 ...

  3. unity3d学习笔记(一) 第一人称视角实现和倒计时实现

    unity3d学习笔记(一) 第一人称视角实现和倒计时实现 1. 第一人称视角 (1)让mainCamera和player(视角对象)同步在一起 因为我们的player是生成的,所以不能把mainCa ...

  4. D3D游戏编程系列(六):自己动手编写第一人称射击游戏之第一人称视角的构建

    说起第一人称射击游戏,不得不提第一人称视角啊,没有这个,那么这个第一就无从谈起啊,我作为一个观察者究竟如何在这个地图上顺利的移动和观察呢,那么,我们一起来研究下. 我们首先来看下CDXCamera类: ...

  5. ThingJS平台制作第一人称视角下的巡更效果

    今天想要做一个类似巡更的过程,就像是在学校保安巡更,小区保安巡更一样.巡更需要用到相应的场景,比如说:园区.学校.超市以及工厂等等,然后需要规划好路线也就是巡更的路线,并且视角要跟随路线来变换,从而达 ...

  6. unity中制作模拟第一人称视角下的指南针

    private int zRotation; public GameObject obj; public void Update() { //obj = GameObject.Find("C ...

  7. 微软Hyperlapse技术:让第一人称摄像稳定而流畅

    编者按:GoPro等第一人称摄像设备已经几乎成为了极限运动者的标配,但拍摄过程中的抖动常会让画面非常糟糕.微软Hyperlapse技术实现了将第一人称录像转化成稳定而流畅的视频.该成果的论文已发表在S ...

  8. Unity——第一人称控制器的实现

    Unity--第一人称控制器的实现 一.功能描述 在一个场景中实现人物的前后左右移动和跳跃功能:其中前后左右移动通过W.A.S.D方向键实现,跳跃功能通过空格键实现,并且考虑到重力作用,来调节跳跃功能 ...

  9. [UE4]第一人称与第三人称

    一.给Character添加一个SkeletalMesh,并设置为第三人称模型.并设置自己看不到该模型. 二.添加给骨骼的右手添加一个Socket插槽用来挂载武器 三.判断当前角色是否被本地Contr ...

随机推荐

  1. 解释一下python中的继承

    当一个类继承另一个类,它就被称为一个子类/派生类,继承父类/基类/超类.它会继承/获取所有类成员(属性和方法) 继承能让我们重新使用代码,也能更容易的创建和维护应用 单继承:一个类继承单个基类 多继承 ...

  2. iOS 什么是函数式编程

    前言:当前只做理解性的常规背书,根据不断深入学习会不断丰富解读内容,欢迎评论提意见 函数式编程:Functional Programming 1 基本解释: 函数式编程 是一种思维模式,一种编程思想, ...

  3. Vuex mapGetters,mapActions

    一.基本用法 1. 初始化并创建一个项目 ? 1 2 3 vue init webpack-simple vuex-demo cd vuex-demo npm install 2. 安装 vuex ? ...

  4. Shell编程基础及变量

    一.Shell脚本 1.Shell脚本的建立 由Linux命令.shell命令.程序结构控制语句和注释等内容组成. 脚本第一行 #!/bin/bash #!字符称为幻数,内核会根据它后面的解释器来确定 ...

  5. R和Python小数的保留

    R: 1.保留几位有效数字: signif(x,digits) 2.保留几位小数: round(x,digits) Python: 1.“%.2f”%a

  6. git基础一

    礼节为上: 从这次的武昌砍人时间分析:一定要对别人客气一点,无论在餐厅,或者任何事情上面一定要对别人客气 即使自己遇到很烦心的事情,也要保持情绪,因为如果遇到神经病,刚好自己没有控制好自己的情绪,自己 ...

  7. Python内置标准模块

    time 模块 1 >>> import time 2 >>> time.time() 3 1491064723.808669 4 >>> # t ...

  8. Adroid真机调试

    几次想学Android,都因为启动模拟器调试时太慢而放弃. 今天终于搞通了真机调试,记录一下: 1)USB线把手机和电脑连接. 2)Adroid手机启用USB调试. 3)命令行运行 adb devic ...

  9. web-view和wx.navigateback

    web-view 我们先来了解一下官方的东西 web-view 组件是一个可以用来承载网页的容器,会自动铺满整个小程序页面.个人类型与海外类型的小程序暂不支持使用. 属性名 类型 默认值 说明 src ...

  10. 解决spring、springMVC重复扫描导致事务失效的问题

    在主容器中(applicationContext.xml),将Controller的注解排除掉 1 2 3 而在springMVC配置文件中将Service注解给去掉 1 2 3 4 因为spring ...