首先创建一个Plane(平面),点击GameObject → 3D Object → Plane

属性设置如图所示:

image.png

再创建一个Cube(立方体),点击GameObject → 3D Object → Cube

复制立方体搭建出一面墙,并添加上Rigidbody属性,将其质量修改为4以免太容易被破坏

image (1).png

调整摄像机位置与角度如图所示:

image (2).png

创建一个名为Move的C#脚本文件编辑如下:

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

/// <summary>
/// 移动控制器类
/// 负责处理物体的三维移动
/// 通过WASD键控制移动:W升高,S下降,A后退,D前进
/// </summary>
public class move : MonoBehaviour
{
    /// <summary>
    /// 物体的Transform组件引用
    /// </summary>
    private Transform transform;
    
    /// <summary>
    /// 移动速度
    /// 可以在Inspector面板中调整
    /// </summary>
    public float moveSpeed = 5f;

    /// <summary>
    /// 初始化方法
    /// 在游戏开始时调用一次
    /// 获取物体的Transform组件
    /// </summary>
    void Start()
    {
        transform = GetComponent<Transform>();
    }

    /// <summary>
    /// 更新方法
    /// 每一帧调用一次
    /// 处理玩家输入并控制物体移动
    /// </summary>
    void Update()
    {
        // 获取水平轴输入(A/D键或左右方向键)- 控制Z轴移动(前进后退)
        float adValue = Input.GetAxis("Horizontal");
        // 获取垂直轴输入(W/S键或上下方向键)- 控制Y轴移动(升降)
        float wsValue = Input.GetAxis("Vertical");

        // 控制物体移动方向
        // adValue控制Z轴移动(A后退,D前进),wsValue控制Y轴移动(W升高,S下降)
        var moveDirection = new Vector3(0, wsValue, adValue);
        // 归一化方向向量,确保斜向移动时速度一致
        // 使用Time.deltaTime使移动平滑,不受帧率影响
        // Space.World使移动基于世界坐标系
        transform.Translate(moveDirection.normalized * moveSpeed * Time.deltaTime, Space.World);
    }
}

将脚本挂载到Main Camera(摄像机)上,在Inspector栏中点击Add Component 搜索栏中输入脚本名称即可挂在上去

创建一个Sphere(球体),点击GameObject → 3D Object → Sphere

随后将Hierarchy栏中的球体拖动至Project中的Assets目录下,随后删除球体模型

为其球体模型添加Rigidbody属性,并将其质量设置为20,勾选Use Gravity(重力)如图所示:

image (3).png

创建一个Create Empty空物体,右击Hierarchy栏中的Main Camera(摄像机)点击Create Empty

重命名为fsq(发射器)

image (4).png

创建一个名为GunShoot的C#脚本文件编辑如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class GunShoot : MonoBehaviour {
 
    public GameObject bulletPrefab;  //子弹预制体
  
  void Update () {
 
        Shoot();  
    }
 
    void Shoot()
    {
        if (Input.GetMouseButtonDown(0))  //如果按下鼠标左键,生成预制体
        {
            Instantiate(bulletPrefab, transform.position, transform.rotation);  //生成预制体
        }
    }
 
}

将脚本挂载到fsq(发射器)上,在Inspector栏中点击Add Component 搜索栏中输入脚本名称即可挂在上去

随后将之前创建的Bullet(球体预制体)拖动至fsq中的Inspector栏中的脚本属性中的Bullet Prefab中

image (5).png

接下来再给球体创建一个名为Bullet的C#脚本文件编辑如下:

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

public class Bullet : MonoBehaviour {
    public float speed = 8f;  //子弹速度
    public float gravity = 0.2f;  //重力加速度(进一步减小以减轻下坠效果)
    private float verticalVelocity = 1f;  //初始垂直速度,帮助子弹射得更远

    void Start () {
        Destroy(gameObject, 7f);  //7s后销毁自身
    }

    void Update () {
        // 计算重力引起的垂直速度变化
        verticalVelocity -= gravity * Time.deltaTime;
        
        // 子弹沿Z轴方向移动(向前),同时受重力影响在Y轴上下降
        transform.Translate(0, verticalVelocity * Time.deltaTime, speed * Time.deltaTime, Space.Self);
    }
}

将脚本挂载到Bullet预制体上,在Inspector栏中点击Add Component 搜索栏中输入脚本名称即可挂在上去

最后运行即可使用WASD进行平面移动,左键进行射击。