三角洲辅助卡盟新版上线,应有尽有
当前位置:首页 > 游戏攻略> 正文

最好玩的对打游戏推荐

发布时间:06/21 10:44:12
手把手教你用Unity开发2D双人对打游戏

一、环境搭建与项目创建

1.1 安装Unity编辑器

访问Unity官网下载Unity Hub:https://unity.com/download

安装Unity Hub后,打开软件,点击"安装编辑器"按钮。

选择Unity 2021.3 LTS版本,安装时勾选以下模块:

  • Windows Build Support(Windows平台构建支持)
  • Mac Build Support(Mac平台构建支持)
  • Android Build Support(Android平台构建支持)
  • iOS Build Support(iOS平台构建支持)

1.2 创建新项目

在Unity Hub中点击"新建项目",选择"2D核心"模板。

项目名称填写"2DFightingGame",位置选择本地硬盘路径。

点击"创建项目"按钮,等待Unity编辑器启动。

二、游戏场景搭建

2.1 设置游戏画布

在Hierarchy面板右键,选择UI -> Canvas,创建游戏UI画布。

选中Canvas,在Inspector面板找到Canvas Scaler组件:

设置UI Scale Mode为"Scale With Screen Size"

设置Reference Resolution为1920x1080

设置Screen Match Mode为"Expand"

2.2 创建游戏背景

在Hierarchy面板右键,选择2D Object -> Sprite,命名为Background。

将Background拖拽到Canvas下作为子物体。

为Background添加Sprite Renderer组件,导入背景图片素材。

三、玩家角色制作

3.1 创建玩家预制体

在Project面板右键,选择Create -> Prefab,命名为PlayerPrefab。

将PlayerPrefab拖拽到场景中,在Hierarchy面板中选中它。

添加以下组件:

  • Sprite Renderer(精灵渲染器)
  • Rigidbody 2D(2D刚体)
  • Box Collider 2D(2D盒状碰撞器)
  • Animator(动画控制器)

3.2 配置物理属性

选中PlayerPrefab,在Rigidbody 2D组件中设置:

Body Type设置为Dynamic

Gravity Scale设置为3

Linear Drag设置为5

在Box Collider 2D组件中,点击Edit Collider按钮调整碰撞框大小。

四、角色动画系统

4.1 创建动画状态机

在Project面板右键,选择Create -> Animator Controller,命名为PlayerAnimator。

双击打开Animator窗口,创建以下动画状态:

  • Idle(待机状态)
  • Walk(行走状态)
  • Jump(跳跃状态)
  • Attack(攻击状态)
  • Hurt(受伤状态)

4.2 设置动画过渡

在Animator窗口中,右键Idle状态,选择Make Transition,连接到Walk状态。

选中过渡箭头,在Inspector面板中设置条件:

添加Float类型参数"Speed",设置条件为Speed > 0.1

同样方法设置其他状态间的过渡条件。

五、输入控制系统

5.1 配置输入管理器

打开Edit -> Project Settings -> Input Manager。

在Axes中,将Size从18改为24,为双人游戏添加额外输入轴。

添加以下输入轴配置:

5.2 玩家1控制配置

Horizontal(水平移动):

  • Negative Button: left
  • Positive Button: right
  • Gravity: 3
  • Dead: 0.001
  • Sensitivity: 3

Vertical(垂直移动):

  • Negative Button: down
  • Positive Button: up
  • Gravity: 3
  • Dead: 0.001
  • Sensitivity: 3

Attack(攻击按键):

  • Positive Button: left ctrl
  • Gravity: 1000
  • Dead: 0.001
  • Sensitivity: 1000

5.3 玩家2控制配置

Horizontal_P2(玩家2水平移动):

  • Negative Button: a
  • Positive Button: d
  • Gravity: 3
  • Dead: 0.001
  • Sensitivity: 3

Vertical_P2(玩家2垂直移动):

  • Negative Button: s
  • Positive Button: w
  • Gravity: 3
  • Dead: 0.001
  • Sensitivity: 3

Attack_P2(玩家2攻击按键):

  • Positive Button: space
  • Gravity: 1000
  • Dead: 0.001
  • Sensitivity: 1000

六、角色控制脚本

6.1 创建玩家控制器

在Project面板右键,选择Create -> C Script,命名为PlayerController。

双击打开脚本,输入以下完整代码:

``` using UnityEngine; public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; public float jumpForce = 10f; public float attackRange = 1f; public float attackDamage = 10f; public bool isPlayer1 = true; private Rigidbody2D rb; private Animator animator; private bool isGrounded = false; private float groundCheckRadius = 0.2f; public Transform groundCheck; public LayerMask groundLayer; void Start() { rb = GetComponent(); animator = GetComponent(); } void Update() { CheckGround(); HandleMovement(); HandleJump(); HandleAttack(); UpdateAnimations(); } void CheckGround() { isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer); } void HandleMovement() { float horizontalInput; if (isPlayer1) horizontalInput = Input.GetAxis("Horizontal"); else horizontalInput = Input.GetAxis("Horizontal_P2"); Vector2 movement = new Vector2(horizontalInput moveSpeed, rb.velocity.y); rb.velocity = movement; } void HandleJump() { if (isGrounded) { if (isPlayer1 && Input.GetButtonDown("Vertical") && Input.GetAxis("Vertical") > 0) rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse); else if (!isPlayer1 && Input.GetButtonDown("Vertical_P2") && Input.GetAxis("Vertical_P2") > 0) rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse); } } void HandleAttack() { string attackButton = isPlayer1 ? "Attack" : "Attack_P2"; if (Input.GetButtonDown(attackButton)) { animator.SetTrigger("Attack"); PerformAttack(); } } void PerformAttack() { Vector2 attackDirection = transform.localScale.x > 0 ? Vector2.right : Vector2.left; RaycastHit2D hit = Physics2D.Raycast(transform.position, attackDirection, attackRange); if (hit.collider != null) { PlayerController otherPlayer = hit.collider.GetComponent(); if (otherPlayer != null && otherPlayer != this) { otherPlayer.TakeDamage(attackDamage); } } } public void TakeDamage(float damage) { animator.SetTrigger("Hurt"); rb.AddForce(new Vector2(0f, 5f), ForceMode2D.Impulse); } void UpdateAnimations() { animator.SetFloat("Speed", Mathf.Abs(rb.velocity.x)); animator.SetBool("IsGrounded", isGrounded); animator.SetFloat("VerticalVelocity", rb.velocity.y); } void OnDrawGizmosSelected() { Gizmos.color = Color.red; Vector2 attackDirection = transform.localScale.x > 0 ? Vector2.right : Vector2.left; Gizmos.DrawLine(transform.position, (Vector2)transform.position + attackDirection attackRange); } } ```

6.2 配置脚本参数

将PlayerController脚本拖拽到PlayerPrefab上。

在Inspector面板中,为PlayerController组件配置参数:

创建空物体命名为GroundCheck,拖拽到PlayerPrefab下作为子物体。

将GroundCheck物体的Transform位置设置为(0, -0.5, 0)。

将GroundCheck物体拖拽到PlayerController的Ground Check字段。

创建新Layer命名为"Ground",将地面物体的Layer设置为Ground。

在PlayerController的Ground Layer下拉菜单中,选择Ground层。

七、游戏界面制作

7.1 创建血量显示

在Hierarchy面板中,右键Canvas,选择UI -> Slider,创建两个Slider。

分别命名为Player1Health和Player2Health。

选中Player1Health,在Inspector面板中设置:

  • Rect Transform:PosX -400, PosY 250, Width 300, Height 30
  • Max Value:100
  • Value:100

选中Player2Health,在Inspector面板中设置:

  • Rect Transform:PosX 400, PosY 250, Width 300, Height 30
  • Max Value:100
  • Value:100

7.2 创建游戏控制器

创建新C脚本命名为GameManager:

``` using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { public static GameManager instance; public PlayerController player1; public PlayerController player2; public Slider player1HealthSlider; public Slider player2HealthSlider; private float player1Health = 100f; private float player2Health = 100f; void Awake() { if (instance == null) instance = this; else Destroy(gameObject); } void Start() { if (player1HealthSlider != null) player1HealthSlider.value = player1Health; if (player2HealthSlider != null) player2HealthSlider.value = player2Health; } public void PlayerTakeDamage(bool isPlayer1, float damage) { if (isPlayer1) { player1Health -= damage; if (player1HealthSlider != null) player1HealthSlider.value = player1Health; if (player1Health <= 0) GameOver(false); } else { player2Health -= damage; if (player2HealthSlider != null) player2HealthSlider.value = player2Health; if (player2Health <= 0) GameOver(true); } } void GameOver(bool player1Wins) { Time.timeScale = 0f; } } ```

八、场景布置与测试

8.1 创建游戏场景

在Hierarchy面板中,创建空物体命名为GameManager。

将GameManager脚本拖拽到该物体上。

创建空物体命名为Ground,添加Sprite Renderer和Box Collider 2D组件。

设置Ground的Position为(0, -3, 0),Scale为(10, 1, 1)。

将Ground的Layer设置为Ground。

8.2 生成玩家实例

将PlayerPrefab从Project面板拖拽到场景中两次。

将第一个实例重命名为Player1,第二个重命名为Player2。

设置Player1的Position为(-2, 0, 0),PlayerController组件的Is Player1勾选为true。

设置Player2的Position为(2, 0, 0),PlayerController组件的Is Player1取消勾选。

修改Player2的Sprite Renderer颜色,与Player1区分。

8.3 配置游戏管理器

选中GameManager物体,在Inspector面板中找到GameManager脚本组件。

将Player1物体拖拽到Player1字段。

将Player2物体拖拽到Player2字段。

将Player1HealthSlider物体拖拽到Player1 Health Slider字段。

将Player2HealthSlider物体拖拽到Player2 Health Slider字段。

九、修改攻击伤害系统

9.1 更新PlayerController脚本

修改PlayerController脚本中的TakeDamage方法:

``` public void TakeDamage(float damage) { animator.SetTrigger("Hurt"); rb.AddForce(new Vector2(0f, 5f), ForceMode2D.Impulse); if (GameManager.instance != null) { GameManager.instance.PlayerTakeDamage(isPlayer1, damage); } } ```

9.2 测试游戏功能

点击Unity编辑器上方的Play按钮开始测试。

使用以下按键控制角色:

玩家1:方向键移动,上箭头跳跃,左Ctrl攻击

玩家2:WASD移动,W跳跃,空格键攻击

测试角色移动、跳跃、攻击功能是否正常。

观察血量条是否随攻击减少。

十、构建游戏可执行文件

10.1 配置构建设置

打开File -> Build Settings。

点击Add Open Scenes按钮添加当前场景。

在Platform列表中选择目标平台(Windows/Mac)。

点击Player Settings按钮,配置游戏信息:

在Player Settings中,设置Company Name和Product Name。

设置Default Icon为游戏图标。

10.2 执行构建

在Build Settings窗口中,点击Build按钮。

选择输出文件夹,点击保存。

等待Unity完成构建过程。

构建完成后,在输出文件夹中找到可执行文件,双击运行测试。

版权保护: 本文由 741卡盟 原创,转载请保留链接: http://741ka.com/gamenews/20906.html