Unity简单实现FPS第一人称视角(一)
Unity简单实现FPS第一人称视角(三)
Unity简单实现FPS第一人称视角(四)
我们在第一人称视角中不会看到全部的人,所以不用添加一个完整的人的模型,只要添加手上的武器的模型即可。
1、首先将摄像机的位置和旋转角度都设0。
2、再将摄像机的Clipping Planes/Near的值设为0.1,这样摄像机就可以看到更近的东西。
3、在Project视图中把枪支模型拖入场景,并置于摄像机层级下方。
4、调整weapon模型的位置和角度,在Camera Preview中的预览效果直到效果满意为止。
现在武器已经显示了,我们还需要显示准心以及子弹数目生命值的UI效果。
1、创建一个Canvas用来显示这些UI。
2、添加3个IMAGE控件,2个TEXT控件
3、调整这些控件的样式,内容,位置达到满意为止。
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游戏体的脚本组件。
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当中
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");
}
}
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";
}
}