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

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. /*
  6. * 键盘鼠标位移和cs操作模式完全一致
  7. * wsad四键 控制camera x和z轴方向位移
  8. * 鼠标 控制camera角度旋转
  9. *
  10. * camera位移时受当时camera角度的影响
  11. */
  12.  
  13. public class MainCameraScript : MonoBehaviour {
  14.  
  15. private float speed = 8.0f;
  16. private float rotationSpeed = 4.0f;
  17. private bool isKeyDown_W = false;
  18. private bool isKeyDown_S = false;
  19. private bool isKeyDown_A = false;
  20. private bool isKeyDown_D = false;
  21. //private bool isKeyDown_Space = false;
  22.  
  23. //x轴旋转方向是反的,所以不能直接用当前欧拉角x去加
  24. private float curRotationX = 0.0f;
  25.  
  26. // Use this for initialization
  27. void Start () {
  28. float posX = gameObject.transform.position.x;
  29. float posZ = gameObject.transform.position.z;
  30. float posY = gameObject.transform.position.y;
  31. Debug.Log("maincamera pos x is:" + posY);
  32. Vector3 rotation = transform.eulerAngles;
  33. Debug.Log("maincamera eulerAngles y is : " + rotation.y);
  34.  
  35. Cursor.visible = false;
  36. }
  37.  
  38. // Update is called once per frame
  39. void Update () {
  40. mouseInput();
  41. keyboardInput();
  42.  
  43. }
  44.  
  45. private void mouseInput()
  46. {
  47. curRotationX = curRotationX + rotationSpeed * Input.GetAxis("Mouse Y");
  48. float rotationY = transform.localEulerAngles.y + rotationSpeed * Input.GetAxis("Mouse X");
  49. transform.localEulerAngles = new Vector3(-curRotationX, rotationY,0);
  50.  
  51. Debug.Log("maincamera eulerAngles y is : " + transform.localEulerAngles.y);
  52. }
  53.  
  54. private void keyboardInput()
  55. {
  56. //Input.GetAxis 按键发生时的增量 最小-1最大1
  57.  
  58. //旋转
  59. float rotation = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
  60. //transform.Rotate(0, rotation, 0);
  61.  
  62. //欧拉角 unity右侧inspector的transform的Rotation里显示的就是欧拉角数值
  63. float eulerAnglesY = transform.eulerAngles.y;
  64. //Debug.Log("eulerAnglesY is : " + eulerAnglesY.ToString());
  65. //前进后退,旋转后会影响到前进后退的方向
  66. if (Input.GetKeyDown(KeyCode.W))
  67. {
  68. Debug.Log("w key down");
  69. isKeyDown_W = true;
  70. //DispatchKeyboardEvent(KeyCode.W, isKeyDown_W);
  71. }
  72. else if (Input.GetKeyUp(KeyCode.W))
  73. {
  74. isKeyDown_W = false;
  75. //DispatchKeyboardEvent(KeyCode.W, isKeyDown_W);
  76. }
  77.  
  78. if (Input.GetKeyDown(KeyCode.S))
  79. {
  80. Debug.Log("s key down");
  81. isKeyDown_S = true;
  82. //DispatchKeyboardEvent(KeyCode.S, isKeyDown_S);
  83. }
  84. else if (Input.GetKeyUp(KeyCode.S))
  85. {
  86. isKeyDown_S = false;
  87. //DispatchKeyboardEvent(KeyCode.S, isKeyDown_S);
  88. }
  89.  
  90. if (Input.GetKeyDown(KeyCode.A))
  91. {
  92. isKeyDown_A = true;
  93. //DispatchKeyboardEvent(KeyCode.A, isKeyDown_A);
  94.  
  95. }
  96. else if (Input.GetKeyUp(KeyCode.A))
  97. {
  98. isKeyDown_A = false;
  99. //DispatchKeyboardEvent(KeyCode.A, isKeyDown_A);
  100. }
  101.  
  102. if (Input.GetKeyDown(KeyCode.D))
  103. {
  104. isKeyDown_D = true;
  105. //DispatchKeyboardEvent(KeyCode.D, isKeyDown_D);
  106. }
  107. else if (Input.GetKeyUp(KeyCode.D))
  108. {
  109. isKeyDown_D = false;
  110. //DispatchKeyboardEvent(KeyCode.D, isKeyDown_D);
  111. }
  112.  
  113. //if (Input.GetKeyDown(KeyCode.Space))
  114. //{
  115. // isKeyDown_Space = true;
  116. //}
  117. //else if (Input.GetKeyUp(KeyCode.Space))
  118. //{
  119. // isKeyDown_Space = false;
  120. //}
  121.  
  122. if (isKeyDown_W)
  123. {
  124. float dx = Mathf.Sin(eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
  125. float dz = Mathf.Cos(eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
  126. transform.position += new Vector3(dx, 0, dz);
  127. }
  128.  
  129. if (isKeyDown_S)
  130. {
  131. float dx = Mathf.Sin(eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
  132. float dz = Mathf.Cos(eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
  133. transform.position += new Vector3(dx, 0, dz);
  134. }
  135.  
  136. if(isKeyDown_A)
  137. {
  138.  
  139. //eulerAnglesY不能直接用
  140. float dx = Mathf.Cos(0-eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
  141. float dz = Mathf.Sin(0-eulerAnglesY * Mathf.Deg2Rad) * -speed * Time.deltaTime;
  142. transform.position += new Vector3(dx, 0, dz);
  143. }
  144.  
  145. if (isKeyDown_D)
  146. {
  147. float dx = Mathf.Cos(0-eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
  148. float dz = Mathf.Sin(0-eulerAnglesY * Mathf.Deg2Rad) * speed * Time.deltaTime;
  149. transform.position += new Vector3(dx, 0, dz);
  150. }
  151.  
  152. //if (isKeyDown_Space)
  153. //{
  154. // float dy = speed * Time.deltaTime;
  155. // transform.position += new Vector3(0, dy, 0);
  156. //}
  157.  
  158. }
  159. }

  

让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. $Java-json系列(二):用JSONObject解析和处理json数据

    本文中主要介绍JSONObject处理json数据时候的一些常用场景和方法. (一)jar包下载 所需jar包打包下载百度网盘地址:https://pan.baidu.com/s/1c27Uyre ( ...

  2. BCM 交换机开发

    转:http://blog.chinaunix.net/uid-23782786-id-3839602.html 前言:        最近搞这玩样,真是折腾,网上的资料都是片段,而且很少.折腾了4. ...

  3. linux文件系统实现原理简述【转】

    本文转载自:https://blog.csdn.net/eleven_xiy/article/details/71249365 [摘要] [背景] [正文] [总结]   注意:请使用谷歌浏览器阅读( ...

  4. vRO 添加已有磁盘到VM

    在vRO实现将已有虚拟机磁盘添加到另外的虚拟机上,以为vRA发布Oracle/SQL集群做准备: // 脚本需要两个输入 vm_obj和diskPathSystem.log("Attempt ...

  5. Struts2的<s:date>标签使用详解[转]

    作用:用来格式化显示日期的格式. 它可以用一种你指定的格式来显示 (如:“yyyy-MM-dd”),可以生成通俗易懂的注释(如:in 2 hours,14 minutes),或者用预先定义的一个格式来 ...

  6. jsonp 实现跨域例子

    直接上代码: js: <html> <head> <title>JSONP</title> </head> <script src = ...

  7. 剑指Offer——反转链表

    Question 输入一个链表,反转链表后,输出链表的所有元素. Solution 如果空间复杂度要求为O(1)的话,可以考虑用三个指针来进行反转 如果没有空间复杂度限制的话,可以考虑用一个栈,将节点 ...

  8. 导出android真机上应用的apk文件

    1. 首先你的手机要开启调试模式 2. 终端输入命令行 (这个时候需要在手机端打开此应用.它的思路是抓取出当前窗口的包名.以下命令操作自己未亲自验证.) adb shell dumpsys windo ...

  9. HDU 5992 kd-tree

    还记得青岛的时候和蕾姐讨论了近三个小时也不知道这是什么东西 后来发现是kdtree 于是拖到寒假才补这个算法 写完几道模板题发现多维的kdtree查找最近也是很简单的拓展 于是很快1A了这道题 它真的 ...

  10. 表单验证-JS实现

    //获取下一个span,可以通过这个对象给状态 function gspan(cobj){ while(true){ if(cobj.nextSibling.nodeName!="SPAN& ...