简介:space warrior是一款第一人称射击游戏,开发难度中等,涉及第一人称角色控制,枪械操作与射击,玩家信息系统,敌人ai,装备交互等。
1,导入资源,创建地图
导入游戏所需要的各种资产(模型、音效、材质、地图等)
将地图拖入场景中(我使用的是已经创建好的地图)
地板和墙壁都太亮了,更换材质,开启护眼模式。
2,开发玩家可以控制的角色
添加一个胶囊体作为玩家本体,将主相机放置在本体的眼睛上,为玩家添加Character Controller。
之后新建脚本,用来接收输入并控制玩家做出相应行为。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float mouseSensitivity = 50f; // 鼠标灵敏度
public float acceleration = 40f; // 加速度
public float maxSpeed = 15f; // 最大速度
public float jumpSpeed = 10f; // 跳跃速度
public float gravity = 9.81f; // 重力
public Transform cameraTransform; // 摄像机位置
bool isGrounded; // 是否在地面上
bool isSecondJump; // 是否可以二段跳
float ySpeed; // 垂直速度
float moveSpeed; // 移动速度
float eyeLimit = 0; // 视角限制
Vector3 input; // 输入
Vector3 move; // 移动
CharacterController cont; // 角色控制器
void Start()
{
cont = GetComponent<CharacterController>(); // 获取角色控制器
}
// Update is called once per frame
void Update()
{
isGrounded = cont.isGrounded; // 判断是否在地面上
Move(); // 移动
Turn(); // 转向
Drop(); // 下落
Jump(); // 跳跃
}
void Move()
{
input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); // 获取输入
moveSpeed = Mathf.MoveTowards(moveSpeed, input.normalized.magnitude * maxSpeed, acceleration * Time.deltaTime); // 计算移动速度
move = transform.TransformDirection(input)*Time.deltaTime*moveSpeed; // 计算移动向量
move += new Vector3(0, ySpeed, 0); // 加上垂直速度
cont.Move(move); // 移动
}
void Drop()
{
if (!isGrounded) // 如果不在地面上
{
ySpeed-= gravity * Time.deltaTime; // 垂直速度减小
}
else // 如果在地面上
{
if (ySpeed < -1) // 如果垂直速度小于-1
{
ySpeed += gravity* Time.deltaTime; // 垂直速度增加
}
if (isSecondJump) // 如果可以二段跳
{
isSecondJump = false; // 重置二段跳
}
}
}
void Jump()
{
if (isGrounded) // 如果在地面上
{
if (Input.GetButtonDown("Jump")) // 如果按下跳跃键
{
ySpeed = jumpSpeed; // 垂直速度设为跳跃速度
}
}
else // 如果不在地面上
{
if (!isSecondJump) // 如果可以二段跳
{
if (Input.GetButtonDown("Jump")) // 如果按下跳跃键
{
ySpeed+= jumpSpeed; // 垂直速度增加
isSecondJump = true; // 二段跳设为不可用
}
}
}
}
void Turn()
{
float MouseX = Input.GetAxis("Mouse X"); // 获取鼠标X轴移动
float MouseY = Input.GetAxis("Mouse Y"); // 获取鼠标Y轴移动
transform.Rotate(Vector3.up,MouseX*mouseSensitivity*Time.deltaTime); // 绕Y轴旋转
eyeLimit -= MouseY * mouseSensitivity * Time.deltaTime; // 视角限制
eyeLimit = Mathf.Clamp(eyeLimit, -80, 80); // 视角限制
cameraTransform.localEulerAngles = Vector3.right * eyeLimit; // 摄像机旋转
}
}
在这其中,jump和drop用于处理玩家的跳起以及下落,move和turn用于处理玩家的移动以及视角的旋转。
在这其中,玩家可以进行二段跳,并且进行运动操作时符合直觉且运动流畅。