第一人称控制的创建

方法一、

特点:相机不用放在玩家模型下方,适合第一人称射击游戏的单人模式使用

一、创建第一人称主角

因为是第一人称,玩家看不见自己,所以直接用胶囊体替代,在胶囊体上添加Character Controller组件,控制玩家移动

二、控制玩家行走跳跃

1、在玩家身上添加PlayerControl脚本控制玩家移动
   
   
  1. private CharacterController cc;//获取组件
  2. public float MoveSpeed = 10;//移动速度
  3. void Start () {
  4. cc = GetComponent<CharacterController>();//得到组件
  5. }

2、添加移动方法,并且在Update方法中调用
   
   
  1. void Update () {
  2. PlayerWalk();//玩家行走方法
  3. }
  4. void PlayerWalk()//玩家行走方法
  5. {
  6. float h = Input.GetAxis("Horizontal");//得到水平轴输入
  7. float v = Input.GetAxis("Vertical");//得到垂直轴输入
  8. cc.Move(cc.transform.TransformDirection(new Vector3(h, 0, v) * Time.deltaTime * MoveSpeed));//控制玩家以自身坐标方向移动
  9. }
3、实现玩家跳跃
   
   
  1. public float vy = 0;//重力
  2. public float gravity = -5;//重力加速度
    
    
  1. void PlayerWalk()//玩家行走方法
  2. {
  3. float h = Input.GetAxis("Horizontal");//得到水平轴输入
  4. float v = Input.GetAxis("Vertical");//得到垂直轴输入
  5. if (!cc.isGrounded)//玩家没有落地
  6. {
  7. vy += gravity * Time.deltaTime;//重力计算
  8. }
  9. //主角跳跃
  10. if (cc.isGrounded&& Input .GetKeyDown(KeyCode.Space))//按下空格键并且玩家已经落地
  11. {
  12. vy = 2f;
  13. }
  14. cc.Move(cc.transform.TransformDirection(new Vector3(h, vy, v) * Time.deltaTime * MoveSpeed));//控制玩家以自身坐标方向移动
  15. }

三、摄像机设置

1、在PlayerControl脚本中进行相机控制
   
   
  1. private Camera m_camera; //添加相机组件
    
    
  1. void Start () {
  2. m_camera = Camera.main;//将当前相机设为主相机
  3. }

2、添加相机控制方法,并且在Update方法中调用
   
   
  1. void CameraControl()//摄像机控制
  2. {
  3. Vector3 cmEuler = m_camera.transform.eulerAngles;
  4. cmEuler.y += Input.GetAxis("Mouse X");//获取鼠标输入
  5. cmEuler.x -= Input.GetAxis("Mouse Y");
  6. m_camera.transform.eulerAngles = cmEuler;
  7. }
    
    
  1. void Update () {
  2. PlayerWalk();//玩家行走方法
  3. CameraControl();//摄像机控制
  4. }

3、摄像机的跟随,添加摄像机高度
   
   
  1. public float cmHight = 0.5f;//相机高度

4、在相机控制函数CameraControl方法中同步相机和玩家视角
   
   
  1. void CameraControl()//摄像机控制
  2. {
  3. Vector3 cmEuler = m_camera.transform.eulerAngles;
  4. cmEuler.y += Input.GetAxis("Mouse X");//获取鼠标输入
  5. cmEuler.x -= Input.GetAxis("Mouse Y");
  6. m_camera.transform.eulerAngles = cmEuler;//得到当前摄像机旋转角度
  7. cmEuler.x = cmEuler.z = 0;
  8. transform.eulerAngles = cmEuler;//同步玩家旋转角度
  9. //摄像机的跟随
  10. m_camera.transform.position = transform.position+new Vector3(0,cmHight,0);//当前位置等于摄像机位置
  11. }

代码总

    
    
  1. private CharacterController cc;//获取组件
  2. public float MoveSpeed = 10;//移动速度
  3. public float vy = 0;//重力
  4. public float gravity = -5;//重力加速度
  5. private Camera m_camera; //添加相机组件
  6. public float cmHight = 0.5f;//相机高度
  7. void Start () {
  8. cc = GetComponent<CharacterController>();//得到组件
  9. m_camera = Camera.main;//将当前相机设为主相机
  10. }
  11. void Update () {
  12. PlayerWalk();//玩家行走方法
  13. CameraControl();//摄像机控制
  14. }
  15. void PlayerWalk()//玩家行走方法
  16. {
  17. float h = Input.GetAxis("Horizontal");//得到水平轴输入
  18. float v = Input.GetAxis("Vertical");//得到垂直轴输入
  19. if (!cc.isGrounded)//玩家没有落地
  20. {
  21. vy += gravity * Time.deltaTime;//重力计算
  22. }
  23. //主角跳跃
  24. if (cc.isGrounded&& Input .GetKeyDown(KeyCode.Space))//按下空格键并且玩家已经落地
  25. {
  26. vy = 2f;
  27. }
  28. cc.Move(cc.transform.TransformDirection(new Vector3(h, vy, v) * Time.deltaTime * MoveSpeed));//控制玩家以自身坐标方向移动
  29. }
  30. void CameraControl()//摄像机控制
  31. {
  32. Vector3 cmEuler = m_camera.transform.eulerAngles;
  33. cmEuler.y += Input.GetAxis("Mouse X");//获取鼠标输入
  34. cmEuler.x -= Input.GetAxis("Mouse Y");
  35. m_camera.transform.eulerAngles = cmEuler;//得到当前摄像机旋转角度
  36. cmEuler.x = cmEuler.z = 0;
  37. transform.eulerAngles = cmEuler;//同步玩家旋转角度
  38. //摄像机的跟随
  39. m_camera.transform.position = transform.position+new Vector3(0,cmHight,0);//当前位置等于摄像机位置
  40. }

四、添加脚步声

在玩家身上添加脚本StopSound,控制脚步声播放
   
   
  1. using UnityEngine;
  2. using System.Collections;
  3. [RequireComponent(typeof(AudioSource))]//表示游戏物体想要挂此脚本时,必须有AudioSource脚本,没有的话,该代码会自动创建AudioSource组件
  4. public class StopSound : MonoBehaviour {
  5. public AudioClip[] stopSound;//将脚步声存进数组中
  6. private CharacterController cc;//得到玩家身上的角色控制器
  7. private AudioSource _audio;//添加组件
  8. void Awake()//得到组件
  9. {
  10. cc = GetComponent<CharacterController>();
  11. _audio = GetComponent<AudioSource>();
  12. }
  13. void Start () {
  14. StartCoroutine(PlaySound());
  15. }
  16. IEnumerator PlaySound()
  17. {
  18. while (true)
  19. {
  20. if (cc.isGrounded && cc.velocity.sqrMagnitude > 0.3f)//玩家着地,并且速度的平方大于0.3时sqrMagnitude返回这个向量的长度的平方(只读)
  21. {
  22. AudioClip acp = stopSound[Random.Range(0, stopSound.Length)];//随机播放脚步声
  23. _audio.PlayOneShot(acp);//只播放一次
  24. yield return new WaitForSeconds(acp.length);
  25. }
  26. else
  27. {
  28. yield return null;//如果不满足上述条件,就直接返回,执行下一个循环
  29. }
  30. }
  31. }
  32. }


方法二、

特点:角色控制脚本和相机控制脚本分开,适合第一人称射击游戏的对战模式使用,相机需要放到模型下方,和方法一相比,除了相机设置不同之外,其他的设置都一样
虽然是第一人称,玩家看不见自己,但是这是对战模式,对方可以看见自己,所以我们使用模型,将模型拖进场景,命名为Player,在Player上上添加Character Controller组件,控制玩家移动

摄像机设置

1、因为相机的旋转是由鼠标在屏幕上的x和y轴控制的,x轴控制相机水平方向旋转,所以鼠标在屏幕上的X轴移动即是相机在三维空间围绕自身的Y轴旋转,Y轴控制相机垂直方向旋转, 所以鼠标在屏幕上的Y轴移动即是相机在三维空间中围绕自身的X轴旋转,将相机放到模型下方,在相机上创建MouseLook脚本中进行相机控制
    
    
  1. public enum RotationAxes { MouseXandY = 0, MouseX = 1, MouseY = 2 }//鼠标控制的枚举类型
  2. public RotationAxes axes = RotationAxes.MouseXandY;//默认鼠标X轴和Y轴一起控制
  3. public float sensitivityX = 15f;//鼠标X方向的灵敏度
  4. public float sensitivityY = 15f;//鼠标Y方向的灵敏度
  5. public float minimunX = -360f;//鼠标X轴旋转的最小范围
  6. public float maximunX = 360f;//鼠标X轴旋转的最大范围
  7. public float minimunY = -60f;//鼠标Y轴旋转的最小范围
  8. public float maximunY = 60f;//鼠标Y轴旋转的最大范围
  9. float rotationY = 0f;//鼠标Y轴旋转的范围

2、添加相机控制方法,并且在Update方法中调用
   
   
  1. void Update () {
  2. CameraControl();//摄像机控制
  3. }
  4. void CameraControl()//摄像机控制
  5. {
  6. if (axes == RotationAxes.MouseXandY)
  7. {
  8. float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
  9. rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
  10. rotationY = Mathf.Clamp(rotationY, minimunY, maximunY);
  11. transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
  12. }
  13. else if (axes == RotationAxes.MouseX)//当控制为鼠标X轴时
  14. {
  15. transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);//当前围绕Y轴水平旋转
  16. }
  17. else//当鼠标控制为Y轴时
  18. {
  19. rotationY += Input.GetAxis("Mouse Y") * sensitivityY;//得到鼠标旋转的范围
  20. rotationY = Mathf.Clamp(rotationY, minimunY, maximunY);//Mathf.Clamp(范围,参数1,参数2)表示将参数1和参数2限制在范围之内,
  21. //当返回值小于参数1时,结果就返回参数1,当返回值大于参数2时,结果就返回参数2,,当在参数1和参数2之间时,结果就返回范围的值
  22. transform.localEulerAngles = new Vector3(-rotationY+90 , 0, 0);//得到当前本地坐标的旋转
  23. }
  24. }
3、在相机上添加MouseLook脚本,选择Mouse Y控制,在玩家模型上添加MouseLook脚本,选择Mouse X控制
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值