【Unity每日一记】Unity脚本教程:用脚本创建物体与输入系统详解
📖 前言
在Unity游戏开发中,动态创建物体和处理用户输入是核心技能。本文将详细介绍如何使用脚本创建物体、处理各种输入方式,并实现一个第一人称射击游戏的子弹发射功能。
🎯 一、预制体(Prefab)基础
1.1 预制体概念
定义:预制体是一个物体的模板,可以随时从Project窗口拖入场景,相当于用模板创建新物体。
优势:
- 提高开发效率
- 保持物体一致性
- 便于批量管理
1.2 创建预制体步骤
- 创建3D物体:在场景中创建需要的物体
- 拖拽到文件夹:将物体从Hierarchy拖到自己创建的Prefabs文件夹中
- 生成预制体:自动创建.prefab文件
如图所示,拖拽后能看到物体的名字变成蓝色,即表示成功设置为预制体
⚙️ 二、脚本创建与销毁物体
2.1 实例化方法 Instantiate()
// 基本实例化方法
public GameObject prefab; // 在Inspector中拖入预制体void CreateObject()
{// 实例化预制体Instantiate(prefab);
}
2.2 Instantiate方法的重载形式
重载形式 | 参数说明 | 代码示例 |
---|---|---|
仅指定父物体 | 预制体 + 父物体Transform | Instantiate(prefab, parentTransform) |
指定位置和朝向 | 预制体 + 位置 + 旋转 | Instantiate(prefab, position, rotation) |
// 示例:在指定位置创建物体
void CreateObjectAtPosition()
{Vector3 spawnPosition = new Vector3(0, 1, 0);Quaternion spawnRotation = Quaternion.identity;Instantiate(prefab, spawnPosition, spawnRotation);
}
2.3 销毁物体方法 Destroy()
// 销毁物体
Destroy(gameObject);// 延迟销毁(3秒后)
Destroy(gameObject, 3f);// 销毁组件
Destroy(GetComponent<Rigidbody>());
🎮 三、输入系统详解
3.1 水平垂直方向输入
void Update()
{// 读取水平输入(A/D或左右箭头)float horizontal = Input.GetAxis("Horizontal");// 读取垂直输入(W/S或上下箭头)float vertical = Input.GetAxis("Vertical");// 移动物体Vector3 movement = new Vector3(horizontal, 0, vertical);transform.Translate(movement * speed * Time.deltaTime);
}
3.2 按键输入检测
方法 | 功能描述 | 适用场景 |
---|---|---|
Input.GetKeyDown(KeyCode key) | 按键按下的瞬间返回true | 角色跳跃、技能释放 |
Input.GetKey(KeyCode key) | 按键持续按下时返回true | 角色移动、持续施法 |
Input.GetKeyUp(KeyCode key) | 按键释放的瞬间返回true | 蓄力技能释放 |
void Update()
{// 空格键按下时跳跃if (Input.GetKeyDown(KeyCode.Space)){Jump();}// 持续按下移动键if (Input.GetKey(KeyCode.W)){MoveForward();}// 释放按键if (Input.GetKeyUp(KeyCode.LeftShift)){StopSprinting();}
}
3.3 鼠标输入检测
方法 | 功能描述 | 参数说明 |
---|---|---|
Input.GetMouseButtonDown(int button) | 鼠标按下的瞬间 | 0=左键, 1=右键, 2=中键 |
Input.GetMouseButton(int button) | 鼠标持续按下 | 同上 |
Input.GetMouseButtonUp(int button) | 鼠标释放的瞬间 | 同上 |
void Update()
{// 鼠标左键按下(射击)if (Input.GetMouseButtonDown(0)){Shoot();}// 鼠标右键持续按下(瞄准)if (Input.GetMouseButton(1)){Aim();}
}
🔫 四、实战:第一人称射击游戏子弹发射
4.1 准备工作
-
创建子弹预制体
- 创建Sphere或Cube作为子弹
- 添加刚体组件(取消重力)
- 拖拽到Project窗口创建预制体
-
设置发射点
- 创建空物体作为发射点
- 放置在摄像机前方合适位置
4.2 完整射击脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Shot : MonoBehaviour
{public Rigidbody prefab;public Transform pos;public int force = 50;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if(Input.GetMouseButtonDown(0)){Rigidbody sphere = Instantiate(prefab, pos.position, pos.rotation);sphere.AddForce(Vector3.forward * force);Destroy(sphere.gameObject, 3.0f);}}
}
4.3 脚本挂载与配置
- 挂载脚本:将脚本挂载到主摄像机
- 拖拽引用:
- 将子弹预制体拖到Bullet Prefab
- 将发射点物体拖到Fire Point
- 取消重力:确保子弹预制体的刚体取消重力选项
4.4 实战步骤
1.把写好的脚本挂载到主摄像机上
2.给我们创建好的物体添加一个Rigidbody刚体属性,要记得取消重力
3.把物体拖到Prefabs栏,把主摄像机拖到pos栏;也可以点击方框右边的圆圈进行添加预制体和位置(Pos)
4.运行即能得到子弹发射的效果
💡 五、重要注意事项
5.1 必须记住的要点
- ✅ 脚本必须挂载到游戏对象上
- ✅ 预制体需要在Inspector中赋值
- ✅ 刚体组件需要正确配置(取消重力)
- ✅ 物体需要设置为预制体才能被实例化
5.2 常见问题解决
问题 | 解决方案 |
---|---|
子弹不发射 | 检查脚本是否挂载,预制体是否赋值 |
子弹下落 | 检查刚体组件的Use Gravity是否取消 |
发射频率过快 | 调整fireRate参数,增加射击间隔 |
子弹不销毁 | 检查Destroy方法的延迟时间 |
🎯 六、扩展功能
6.1 添加子弹效果
// 添加子弹轨迹效果
void AddBulletEffects(GameObject bullet)
{// 添加粒子效果ParticleSystem trail = bullet.AddComponent<ParticleSystem>();// 添加光源效果Light bulletLight = bullet.AddComponent<Light>();bulletLight.range = 2f;bulletLight.color = Color.yellow;
}
6.2 弹药系统
[Header("弹药系统")]
public int maxAmmo = 30;
public int currentAmmo;
public float reloadTime = 2f;private bool isReloading = false;void Start()
{currentAmmo = maxAmmo;
}void Update()
{if (isReloading)return;if (currentAmmo <= 0 || Input.GetKeyDown(KeyCode.R)){StartCoroutine(Reload());return;}// 射击逻辑...
}System.Collections.IEnumerator Reload()
{isReloading = true;Debug.Log("装弹中...");yield return new WaitForSeconds(reloadTime);currentAmmo = maxAmmo;isReloading = false;Debug.Log("装弹完成!");
}
📚 总结
通过本教程,你学会了:
- ✅ 预制体的创建和使用
- ✅ 使用脚本动态创建和销毁物体
- ✅ 处理键盘和鼠标输入
- ✅ 实现完整的射击系统
实践建议:
- 多练习不同的输入组合
- 尝试为子弹添加更多特效
- 扩展弹药系统和换弹功能
🚀 动手实践:尝试修改子弹速度、添加不同的武器类型,创造属于你自己的射击系统!
版权声明:本文采用 CC BY-NC-SA 4.0 协议
欢迎交流:在评论区分享你的实现效果和遇到的问题!