当前位置:   article > 正文

【Unity学习笔记】第一人称射击游戏_unity射击游戏需要什么知识点

unity射击游戏需要什么知识点

1、新建一个地面Plan。
2、搭建好Player模型。把枪的模型拖入,调整好角度。由于是第一人称游戏。把camera也拖入Player下。
在这里插入图片描述
3、编写playerMove脚本,实现asdw控制人物的前后左右移动 空格键跳跃的功能
知识点1:由于是3D第一人称游戏,玩家的移动应以自身坐标轴为准,玩家移动脚本编写为

   		//人物的位移 以自身坐标为准
        transform.Translate(new Vector3(x, 0, y)*speed*Time.deltaTime,Space.Self);
  • 1
  • 2

知识点2:玩家地面监测:设置玩家不能在空中跳跃,需要借助射线检测玩家是否碰及物体

 bool IsGround()
    {
    	//打印射线以便观察
    	 Debug.DrawRay(transform.position, Vector3.down,Color.red,1f);
        //以当前物体的中心点为起点向下发射一条长度为distance的射线,射线检测是否触碰到碰撞盒 返回true/false
        //射线检测              以哪一位置为中心  向哪个方向发射 向下的距离 Vector3.down=new Vector(0,-1,0);
        return Physics.Raycast(transform.position,Vector3.down,distance);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _PlayerMove : MonoBehaviour
{
    //asdw控制人物的前后左右移动 空格键跳跃
    //改变人物的transform
    public float speed = 5f;
    public float distance = 0.2f;
    void Update()
    {
        float x = Input.GetAxis("Horizontal");
        float y = Input.GetAxis("Vertical");
        //人物的位移 以自身坐标为准
        transform.Translate(new Vector3(x, 0, y)*speed*Time.deltaTime,Space.Self);
        if (Input.GetButtonDown("Jump"))
        {
          //  Debug.Log(IsGround());
            //获取刚体,给物体添加一个向上的力
            if (IsGround())
            {
                GetComponent<Rigidbody>().velocity = transform.up * speed;
            }
                
        }
    }
    bool IsGround()
    {
    	//打印射线以便观察
    	 Debug.DrawRay(transform.position, Vector3.down,Color.red,1f);
        //以当前物体的中心点为起点向下发射一条长度为distance的射线,射线检测是否触碰到碰撞盒 返回true/false
        //射线检测              以哪一位置为中心  向哪个方向发射 向下的距离 Vector3.down=new Vector(0,-1,0);
        return Physics.Raycast(transform.position,Vector3.down,distance);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

4、编写PlayerRotation脚本 用鼠标控制玩家旋转

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _PlayerRotation : MonoBehaviour
{
    //鼠标的x轴移动方向及速度
    float x;
    float y;
    public float Speed = 2f;
    public GameObject MainCarm;
    // Start is called before the first frame update
    void Start()
    {
        x = MainCarm.transform.eulerAngles.x;
    }

    // Update is called once per frame
    void Update()
    {
        //若按下鼠标右键
        if(Input.GetMouseButton(1)){
            //人物Y轴变化量
            y = Input.GetAxis("Mouse X")*Speed;
            //物体以Y轴为中心进行旋转                            
            //Quaternion.Euler(0, y, 0) 把欧拉角转化成对应的四元数
            transform.localRotation = transform.localRotation * Quaternion.Euler(0, y, 0);

            //摄像机X轴数值
            x -= Input.GetAxis("Mouse Y") * Speed;
            //限定范围
            x = Mathf.Clamp(x,-60, 45);

            //改变摄像机自身的X轴数值(欧拉角)
            MainCarm.transform.localEulerAngles = new Vector3(x, 0, 0);
            
            //MainCarm.transform.localEulerAngles = new Vector3(x, 0, MainCarm.transform.eulerAngles.z);


        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

发射子弹,装填子弹。当装填子弹时,子弹不能发射

 void Update()
    {
        stateInfo = anim.GetCurrentAnimatorStateInfo(0);
        gunAnimStart();
        if (gunType==0)
             text.text = "子弹数量:" +"无穷";
        else
             text.text = "子弹数量:" + buttleNumber;
       //切换枪支
        if (Input.GetKeyDown(KeyCode.Q))
        {

            gunType++;
            gunType=gunType%2;
            playerGunState.Close();
            playerGunState.isbool = true;
            if (gunType == 0)
            {
                object98k.SetActive(true);
                objectM24.SetActive(false);
                
                anim = object98k.GetComponent<Animator>();
                stateInfo = anim.GetCurrentAnimatorStateInfo(0);
                buttleNumber = 10;//初始化
               
            }
            else
            {
                object98k.SetActive(false);
                objectM24.SetActive(true);
                anim = objectM24.GetComponent<Animator>();
                stateInfo = anim.GetCurrentAnimatorStateInfo(0);
            }
        }

        if (stateInfo.fullPathHash == Animator.StringToHash("Base Layer.Bolt"))
        {
            anim.SetInteger("shoot", -1);//
        }

        if (stateInfo.fullPathHash == Animator.StringToHash("Base Layer.Idle"))  
        {
           // Debug.Log("11111");
            if (Input.GetMouseButtonDown(0))
            {
                
                gunfire();
                if(buttleNumber>0)
                    buttleNumber--;
                anim.SetInteger("shoot", 1);//切换到发射
            }
        }

        playermove();
    }
      public void playermove()
    {
        float x = Input.GetAxis("Horizontal");
        float y = Input.GetAxis("Vertical");
        //人物的位移 以自身坐标为准
        transform.Translate(new Vector3(x, 0, y) * speed * Time.deltaTime, Space.Self);
        if (Input.GetButtonDown("Jump"))
        {
            Debug.Log(IsGround());
            //获取刚体,给物体添加一个向上的力
            if (IsGround())
            {

                GetComponent<Rigidbody>().velocity = transform.up * speed;
            }
        }
    }
  	public void gunfire()
    {
        GameObject bullets = Resources.Load<GameObject>("bullet");
        GameObject bullet1 = Instantiate(bullets, GunPosition.position, GunPosition.rotation);

        Vector3 hitPoint;
        //从屏幕中央位置发射一条射线
        Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
        //射线是否触碰到物体
        if(Physics.Raycast(ray,out raycastHit))
        {
            //Debug.Log()
            hitPoint = raycastHit.point;
            bullet1.transform.LookAt(hitPoint);//将子弹看向发射的点
            //子弹的飞行路径
            Debug.DrawLine(GunPosition.position, hitPoint, Color.red, 3f);
            //camera的  Debug.DrawLine打印的是一段射线, Debug.DrawRay是朝某个位置发射射线
            Debug.DrawLine(Camera.main.transform.position, hitPoint, Color.yellow, 3f);
        }
        

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号