• Unity制作射击游戏案例01(控制角色+发射子弹+摄像机跟踪)


     整理逻辑思路:

    //【业务逻辑】这个脚本用来1.控制物体移动旋转(WASD)、   2.发射子弹(空格键)

    //【程序逻辑2】

    首先检测用户没有按下空格键 2.如果按下呢执行发射子弹函数    3.克隆子弹 4.让克隆的子弹往前跑

    搭建场景

    为子弹模板添加刚体,并且限制旋转

    编写脚本:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEditor;
    5. using UnityEngine.UI;
    6. using System.IO;
    7. public class RoleControl : MonoBehaviour
    8. {
    9. //【业务逻辑】这个脚本用来控制物体移动旋转(WASD)、发射子弹(空格键)
    10. //【程序逻辑】1.首先检测用户是否按下空格键 2.如果按下就执行发射子弹的函数
    11. // 3.发射子弹的函数:创建一个子弹 (克隆函数)4.然后让子弹往枪口前方Z轴移动
    12. public GameObject Zidanmuban;//用来存储子弹模板物体
    13. public GameObject ZidanBorn;//用来存储子弹的出生地空物体
    14. public GameObject ZidanParent;//将来用于存储场景中克隆出来的子弹的父物体
    15. public float Forcedaxiao = 10f;
    16. //---------------------------------------------
    17. GameObject tempZidan;//用来存储克隆出来的临时子弹物体
    18. public float Movespeed = 10f;//主角移动速度控制
    19. public float Rotatepeed = 10f;//主角旋转速度控制
    20. float RotationY;//用来累积存储用户每次移动鼠标得出的值
    21. float RotationX;//用来累积存储用户每次移动鼠标得出的值
    22. void Start()
    23. {
    24. Zidanmuban = GameObject.Find("Zidanmuban"); //从场景中查找到并存储子弹模板物体
    25. ZidanBorn = GameObject.Find("ZidanBorn");//从场景中查找到并存储子弹出生地物体
    26. ZidanParent = GameObject.Find("ZidanParent");//从场景中查找到并存储子弹父亲物体
    27. }
    28. void Update()
    29. {
    30. ControlMove();//用来控制主角移动旋转
    31. if (Input.GetKeyDown(KeyCode.Space))
    32. {
    33. Debug.Log("用户按下空格键");
    34. FPSShot();
    35. }
    36. GameObject.Destroy(tempZidan, 2f);//两秒后销毁物体
    37. }
    38. void FPSShot()
    39. {
    40. Debug.Log("用户开始发射子弹");
    41. tempZidan = GameObject.Instantiate(Zidanmuban, ZidanBorn.transform.position, Quaternion.Euler(0, 0, 0), ZidanParent.transform);//克隆子弹
    42. tempZidan.GetComponent().AddForce(ZidanBorn.transform.forward*Forcedaxiao, ForceMode.Impulse);
    43. tempZidan.transform.Rotate(ZidanBorn.transform.TransformDirection(new Vector3(90,0,0)));
    44. }
    45. void ControlMove()//用来控制主角移动旋转
    46. {
    47. //【控制物体旋转】
    48. // 获取鼠标的旋转输入值 ,Mouse X\ MouseY 是来源鼠标在水平方向的移动数值转换返回为-1 - 1 之间的数值
    49. float RotaY = Input.GetAxis("Mouse X");//鼠标水平移动返回-1 - + 1,这个数值将来用来给物体绕Y轴旋转
    50. float RotaX = Input.GetAxis("Mouse Y");//鼠标水平移动返回-1 - + 1,这个数值将来用来给物体绕X轴旋转
    51. //这是使用欧拉角的旋转方式,这种旋转有个缺陷就是,旋转一个轴没有问题!不能同时旋转2个及以上的轴。
    52. //transform.Rotate(new Vector3(RotaX * Rotatespeed,RotaY * Rotatespeed,0),Space.Self);
    53. //旋转2个及以上的轴,需要用四元数赋值给Retation
    54. RotationY += RotaY * Rotatespeed*Time.deltaTime;
    55. RotationX+= RotaX * Rotatespeed * Time.deltaTime;
    56. this.transform.rotation = Quaternion.Euler(RotationX, RotationY, 0);
    57. LimtRotatX();
    58. }
    59. void LimtRotatX()
    60. {//限制了上下旋转也就是围绕X轴旋转的最小角度和最大角度 !注意 -50 代表后仰旋转!60 度代表了!往前旋转!
    61. RotationX = Mathf.Clamp(RotationX,-50,60);
    62. }
    63. }

    摄像机跟踪和脚本

    这个脚本需要挂在到摄像机,里面谈到的目标物体是在场景中,主角身上加了个空物体,并且放在主角后方,这个变量需要外部给

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class CameraFollow : MonoBehaviour
    5. {
    6. // 用来控制摄像机平滑跟踪
    7. [SerializeField]
    8. public GameObject oneTarget;//摄像机跟踪目标点,外部赋值
    9. public float Followspeed = 1f;
    10. void Update()
    11. {
    12. if (oneTarget != null)
    13. {
    14. Vector3 FinllTargetPos = oneTarget.transform.TransformPoint(0, 5, -5);
    15. this.transform.position = Vector3.Lerp(this.transform.position, FinllTargetPos, Followspeed * Time.deltaTime);
    16. transform.LookAt(oneTarget.transform);
    17. }
    18. }
    19. }

  • 相关阅读:
    YOLOv8 : 数据组织
    【数据结构】-----二叉树(递归、层次实现二叉树的遍历)
    使用C#编写.NET分析器(三)
    MySql 查询优化
    利用python为你集成三方apk里的lib时自动生成Android.bp
    解锁新机遇——易天欧洲ECOC通讯展预告,精彩即将开始!
    【数据结构】单链表
    Redis 主从复制、哨兵模式、Cluster集群
    博通BCM575系列 RDMA 网卡驱动 bnxt_re 分析(一)
    Flask 学习-16.项目设计与蓝图的使用
  • 原文地址:https://blog.csdn.net/leoysq/article/details/133159606