1、新建一个地面Plan。
2、搭建好Player模型。把枪的模型拖入,调整好角度。由于是第一人称游戏。把camera也拖入Player下。
3、编写playerMove脚本,实现asdw控制人物的前后左右移动 空格键跳跃的功能
知识点1:由于是3D第一人称游戏,玩家的移动应以自身坐标轴为准,玩家移动脚本编写为
//人物的位移 以自身坐标为准
transform.Translate(new Vector3(x, 0, y)*speed*Time.deltaTime,Space.Self);
知识点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);
}
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);
}
}
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);
}
}
}
发射子弹,装填子弹。当装填子弹时,子弹不能发射
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);
}
}