Unity简单实现FPS第一人称视角(二)

Unity简单实现FPS第一人称视角(二)

实现界面(子弹数目和准心还有武器)

Unity简单实现FPS第一人称视角(一)
Unity简单实现FPS第一人称视角(三)
Unity简单实现FPS第一人称视角(四)

添加武器模型

我们在第一人称视角中不会看到全部的人,所以不用添加一个完整的人的模型,只要添加手上的武器的模型即可。
1、首先将摄像机的位置和旋转角度都设0。
Unity简单实现FPS第一人称视角(二)_第1张图片
2、再将摄像机的Clipping Planes/Near的值设为0.1,这样摄像机就可以看到更近的东西。
在这里插入图片描述
3、在Project视图中把枪支模型拖入场景,并置于摄像机层级下方。
Unity简单实现FPS第一人称视角(二)_第2张图片
4、调整weapon模型的位置和角度,在Camera Preview中的预览效果直到效果满意为止。
Unity简单实现FPS第一人称视角(二)_第3张图片

添加UI场景

现在武器已经显示了,我们还需要显示准心以及子弹数目生命值的UI效果。
1、创建一个Canvas用来显示这些UI。
Unity简单实现FPS第一人称视角(二)_第4张图片
2、添加3个IMAGE控件,2个TEXT控件
Unity简单实现FPS第一人称视角(二)_第5张图片
3、调整这些控件的样式,内容,位置达到满意为止。
Unity简单实现FPS第一人称视角(二)_第6张图片
4、创建GameManager.cs脚本,并添加代码如下。
添加代码获得场景控件的属性

public static GameManager instance;

//控件
Text text_life; //生命值数目Text
Text text_zidan; //子弹数目Text

public int m_numZidan = 100;  //子弹的数目

Player m_player;    //玩家游戏体

void Start()
{
    instance = this;
        
    //执行这一步前需要把Player游戏体的tag设置为Player
    m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
    //绑定控件
    GameObject main_canvas = GameObject.Find("MainCanvas");
    foreach(Transform t in main_canvas.GetComponentsInChildren<Transform>())
    {
        if(0 == t.name.CompareTo("Text_Life"))
        {
            text_life = t.GetComponent<Text>();
        }
        if(0 == t.name.CompareTo("Text_Zidan"))
        {
            text_zidan = t.GetComponent<Text>();
        }
    }
}

添加代码,用于更新UI信息

public void setZiDan(int num)
{
    m_numZidan -= num;
    if(m_numZidan <= 0)
    {
        m_numZidan = 100 - m_numZidan;
    }
    text_zidan.text = m_numZidan.ToString() + "/100";
}

创建一个空的GameObject,命名为GameManager并将GameManager.cs指定为GameManager游戏体的脚本组件。
Unity简单实现FPS第一人称视角(二)_第7张图片

发射子弹代码

1、给Player游戏体添加AudioSource声音源组件。需要播放声音的游戏体都需要该组件。
修改Player.cs代码如下。
1、添加发射子弹的音频文件和声音源组件,和子弹发射的间隔频率属性

//声音源组件
public AudioSource m_audio;
//添加发射子弹的音频属性
public AudioClip m_shootClip;
//子弹的间隔
float m_shootTimer = 0;

2、再Start函数中获取Player游戏体的声音源组件属性

void Start()
{
	.....
	m_audio = GetComponent<AudioSource>();
}

3、修改Update函数,添加发射子弹的代码

 void Update()
{
    Control();

    m_shootTimer -= Time.deltaTime;
    if(Input.GetMouseButton(0) && m_shootTimer <= 0)
    {
        m_shootTimer = 0.1f;
        m_audio.PlayOneShot(m_shootClip);
        //调用GameManager当中的跟新子弹数目的函数
        GameManager.instance.setZiDan(1);
    }
}

3、将音频shoot.wav绑定到Player.cs的m_shootClip当中
在这里插入图片描述

最终效果

完整的Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    //角色获取Player的Transform组件
    public Transform m_tranform;
    //角色的移动速度
    public float m_speed = 3.0f;
    //重力
    public float m_gravity = 2.0f;
    //声音源组件
    public AudioSource m_audio;
    //用来获取角色控制组件
    CharacterController m_chaController;
    //用于获取摄像机tranform组件
    public Transform m_camTransform;
    //用于获取摄像机的角度
    Vector3 m_camRot;
    //用于控制摄像机的高度
    float m_camHigh = 1.4f;
    //添加发射子弹的音频属性
    public AudioClip m_shootClip;
    //控制子弹发射频率
    float m_shootTimer = 0;
    void Start()
    {
        m_tranform = this.transform;
        m_audio = GetComponent<AudioSource>();
        m_chaController = GetComponent<CharacterController>();

        //获取主摄像机的transform组件
        m_camTransform = Camera.main.transform;
        m_camTransform.position = m_tranform.TransformPoint(0, m_camHigh, 0);
        m_camTransform.rotation = m_tranform.rotation;
        m_camRot = m_tranform.eulerAngles;
        //锁定鼠标
        Cursor.lockState = CursorLockMode.Locked;
    }
    // Update is called once per frame
    void Update()
    {
        Control();

        m_shootTimer -= Time.deltaTime;
        if(Input.GetMouseButton(0) && m_shootTimer <= 0)
        {
            m_shootTimer = 0.1f;
            m_audio.PlayOneShot(m_shootClip);
            //调用GamerMangar当中的跟新子弹数目的函数
            GameManager.instance.setZiDan(1);
        }
    }
    //用来控制角色移动
    void Control()
    {
        //控制主角移动代码
        Vector3 moveTo = Vector3.zero;
        moveTo.x = Input.GetAxis("Horizontal") * Time.deltaTime * m_speed;
        moveTo.z = Input.GetAxis("Vertical") * Time.deltaTime * m_speed;
        moveTo.y -= m_gravity * Time.deltaTime;

        m_chaController.Move(m_tranform.TransformDirection(moveTo));

        //控制摄像机代码
        float rh = Input.GetAxis("Mouse X");
        float rv = Input.GetAxis("Mouse Y");

        m_camRot.x -= rv;
        m_camRot.y += rh;
        m_camTransform.eulerAngles = m_camRot; //旋转摄像机

        Vector3 camrot = m_camTransform.eulerAngles;
        camrot.x = 0;
        camrot.z = 0;
        m_tranform.eulerAngles = camrot; //仅仅只需要让主角的面朝向相机的方向就行了,不用旋转别的方向

        //保持主角摄像机在上方
        m_camTransform.position = transform.TransformPoint(0, m_camHigh, 0);
    }
    private void OnDrawGizmos()
    {
        Gizmos.DrawIcon(transform.position, "spawn.tif");
    }
}

完整的GameManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
    // Start is called before the first frame update
    public static GameManager instance;

    //控件
    Text text_life; //生命值数目Text
    Text text_zidan; //子弹数目Text

    public int m_numZidan = 100;  //子弹的数目

    Player m_player;    //玩家游戏体

    void Start()
    {
        instance = this;
        
        //执行这一步前需要把Player游戏体的tag设置为Player
        m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
        //绑定控件
        GameObject main_canvas = GameObject.Find("MainCanvas");


        foreach(Transform t in main_canvas.transform.GetComponentsInChildren<Transform>())
        {
            if(0 == t.name.CompareTo("Text_Life"))
            {
                text_life = t.GetComponent<Text>();
            }
            if(0 == t.name.CompareTo("Text_Zidan"))
            { 
                text_zidan = t.GetComponent<Text>();
            }
        }
    }

    public void setZiDan(int num)
    {
        m_numZidan -= num;
        if(m_numZidan <= 0)
        {
            m_numZidan = 100 - m_numZidan;
        }
        text_zidan.text = m_numZidan.ToString() + "/100";
    }
}

你可能感兴趣的:(UnityDemo)