许可优化
产品
解决方案
服务支持
关于
软件库
当前位置:服务支持 >  软件文章 >  Unity3D基础案例-双人乒乓

Unity3D基础案例-双人乒乓

阅读数 4
点赞 0
article_banner

引言:人生无处不代码,无代码处不人生。今天给大家分享双人打乒乓游戏的主要开发流程。

开发版本:unity 5.3.5f

适合人群:初学Unity者

源文件链接请见文末!

开启学习之旅吧!

 

游戏效果预览:

玩法:两人使用W/S键,上下键来分别控制左右的挡板,当一方没有接到球时,另一方加一分

 

01 场景搭建

创建2D工程PingPong,并创建新场景MainScene,导入素材,完成初始场景搭建

注意工程路径最好不要有中文

注意Order in Layer可以控制sprite渲染先后顺序,数值越大,后渲染,显示在其他sprite的上面

例如:上图中间线数值为0,显示在背景数值为-1的上面

 

02 开发围墙

新建四个空对象,分别添加BoxCollider2D组件,并设置父对象WallGroup

使用代码控制Collider的大小和位置,新建脚本GameManager.cs

将GameManager设置为单例模式

在我们的整个游戏生命周期当中,有很多对象从始至终有且只有一个。这个唯一的实例只需要生成一次,并且直到游戏结束才需要销毁。 

单例模式一般应用于管理器类,或者是一些需要持久化存在的对象。

  1. private static GameManager _instance;
  2. public static GameManager Instance
  3. {
  4. get
  5. {
  6. return _instance;
  7. }
  8. }
  9. private void Awake()
  10. {
  11. _instance = this;
  12. }
csharp
运行

a点为世界坐标中心点,A点为屏幕坐标中心点

新建方法ResetWallPos(),在Start()里调用一次即可

  1. void ResetWallPos()
  2. {
  3. //分别获取各个墙的collider组件
  4. _upWallBoxCollider2D = _upWall.GetComponent<BoxCollider2D>();
  5. _downWallBoxCollider2D = _downWall.GetComponent<BoxCollider2D>();
  6. _rightWallBoxCollider2D = _rightWall.GetComponent<BoxCollider2D>();
  7. _leftWallBoxCollider2D = _leftWall.GetComponent<BoxCollider2D>();
  8. //new Vector2(Screen.width, Screen.height) 该点是屏幕的右上角
  9. //Camera.main.ScreenToWorldPoint将屏幕坐标点转化为世界坐标点
  10. //_screenToWorldPointPos就是图中的(x,y)
  11. Vector3 _screenToWorldPointPos = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height));
  12. //_screenToWorldPointPos.y + 0.5f的偏差是为了让上面的墙向上偏移0.5m,以下同理
  13. _upWall.transform.position = new Vector3(0, _screenToWorldPointPos.y + 0.5f, 0);
  14. //设置Collider的Size属性,长度为_screenToWorldPointPos.x * 2
  15. _upWallBoxCollider2D.size = new Vector2(_screenToWorldPointPos.x * 2, 1);
  16. _downWall.transform.position = new Vector3(0, -_screenToWorldPointPos.y - 0.5f, 0);
  17. _downWallBoxCollider2D.size = new Vector2(_screenToWorldPointPos.x * 2, 1);
  18. _rightWall.transform.position = new Vector3(_screenToWorldPointPos.x + 0.5f, 0, 0);
  19. _rightWallBoxCollider2D.size = new Vector2(1, _screenToWorldPointPos.y * 2);
  20. _leftWall.transform.position = new Vector3(-_screenToWorldPointPos.x - 0.5f, 0, 0);
  21. _leftWallBoxCollider2D.size = new Vector2(1, _screenToWorldPointPos.y * 2);
  22. }
csharp
运行

 

03 开发Player

新建一个2D精灵对象,标签设置为Player,设置为预制体,然后创建两个Player,即Player_Left和Player_Right

挂载Rigidbody2D和Box Collider2D组件,设置Gravity Scale为0,冻结Z轴旋转,X轴位移

Collision Detection也可以设置为continuous,防止因为速度过快而穿越player的现象

添加PlayerController.cs脚本

首先利用添加刚体速度控制挡板的上下移动

  1. //Public 用于外部设置控制键
  2. public KeyCode _upKey;
  3. public KeyCode _downKey;
  4. public float speed = 10;
  5. private void Update()
  6. {
  7. //Input.GetKey()当按键不放时,一直返回true
  8. //通过if else if来判断按键情况,并设置player运动状态
  9. if (Input.GetKey(_upKey))
  10. {
  11. //通过修改Rigidbody2D.velocity刚体速度,来模拟逐渐加速的过程,可以理解为加速度
  12. //该命令会使物体向Y轴上方移动
  13. _rigidbody2D.velocity = new Vector2(0, speed);
  14. }
  15. else if (Input.GetKey(_downKey))
  16. {
  17. //该命令会使物体向Y轴下方移动
  18. _rigidbody2D.velocity = new Vector2(0, -speed);
  19. }
  20. else
  21. {
  22. //不按上下键时,刚体速度设为0
  23. _rigidbody2D.velocity = new Vector2(0, 0);
  24. }
  25. }
csharp
运行

Player上下移动地按键可以在Inspector面板设置

左边的Player设置为W/S键,右边的设置为S上下键

代码控制Player的位置,使得挡板分别位于左右两边的中间,距离边缘10 像素 距离

在GameManager.cs中添加ResetPlayer()方法,在Start()方法中调用一次

  1. private void ResetPlayer()
  2. {
  3. rightPlayerPos = Camera.main.ScreenToWorldPoint(new Vector2(Screen.width - 10, Screen.height / 2));
  4. _rightPlayer.position = rightPlayerPos;
  5. leftPlayerPos = Camera.main.ScreenToWorldPoint(new Vector2(10, Screen.height / 2));
  6. _leftPlayer.position = leftPlayerPos;
  7. }
csharp
运行

 

04 开发Ball

制作小球Ball,可以将其位置放在画面中点,并设置其标签为Ball

右键Creat一个Physics2D material ,弹性设置为1

Ball上挂载脚本Wall.cs

首先实现Ball随机左右发球,InitForce()在Start()中只调用一次

  1. private void InitForce()
  2. {
  3. //Random.Range随机取整值,但取不到右边的值2,可以取值0,1
  4. int number = Random.Range(0, 2);
  5. if (number == 1)
  6. {
  7. //AddForce对刚体添加一个方向的力
  8. //Vector2.right等于new Vector2(1,0)
  9. _rigidbody2D.AddForce(Vector2.right * 100);
  10. }
  11. else
  12. {
  13. _rigidbody2D.AddForce(-Vector2.right * 100);
  14. }
  15. }
csharp
运行

 

当小球碰撞到挡板后,获取上下移动的速度

  1. private void OnCollisionEnter2D(Collision2D collision)
  2. {
  3. if (collision.collider.CompareTag("Player"))
  4. {
  5. //获取Ball的Rigidbody2D组件的速度
  6. Vector2 velocity = _rigidbody2D.velocity;
  7. //给Ball添加一个y轴方向的刚体速度
  8. //为了防止Ball速度,无限增加,减半增加
  9. velocity.y = velocity.y / 2f + collision.rigidbody.velocity.y /2f;
  10. _rigidbody2D.velocity = velocity;
  11. }
  12. }
csharp
运行

 

控制小球运动速度,防止其速度过低,影响游戏体验

  1. private void Update()
  2. {
  3. Vector2 velocity = _rigidbody2D.velocity;
  4. if (velocity.x < 10 && velocity.x > -10 && velocity.x != 0)
  5. {
  6. if (velocity.x > 0)
  7. {
  8. velocity.x = 10;
  9. }
  10. else
  11. {
  12. velocity.x = -10;
  13. }
  14. _rigidbody2D.velocity = velocity;
  15. }
  16. }
csharp
运行

05 设计分数

用UGUI创建两个 Text 用来计分,需要引入命名空间using UnityEngine.UI;

在GameManager中添加以下代码

  1. public Text leftText;
  2. public Text rightText;
  3. private int leftScore;
  4. private int rightScore;
  5. public void ChangeScore(string name)
  6. {
  7. if (name == "leftWall")
  8. {
  9. rightScore++;
  10. }
  11. else if (name == "rightWall")
  12. {
  13. leftScore++;
  14. }
  15. //分数更改后,更新Text
  16. leftText.text = leftScore.ToString();
  17. rightText.text = rightScore.ToString();
  18. }
csharp
运行

在Ball.cs中调用ChangeScore方法

  1. private void OnCollisionEnter2D(Collision2D collision)
  2. {
  3. if (collision.collider.CompareTag("Player"))
  4. {
  5. Vector2 velocity = _rigidbody2D.velocity;
  6. velocity.y = velocity.y / 2f + collision.rigidbody.velocity.y /2f;
  7. _rigidbody2D.velocity = velocity;
  8. }
  9. //当小球碰撞到左右两边的墙时,进行加分
  10. if (collision.collider.name == "rightWall" || collision.collider.name == "leftWall")
  11. {
  12. //GameManager.Instance调用Gamemanager的唯一实例
  13. GameManager.Instance.ChangeScore(collision.collider.name);
  14. }
  15. }
csharp
运行

06 添加音效

在MainCamera上添加组件AudioSource,audioclip设置背景音乐ChillMusic,勾选play on awake,loop选项

为四面墙添加AudioSource组件,并为AudioClip添加Click音效,挂载Wall.cs脚本

  1. public class Wall : MonoBehaviour
  2. {
  3. private AudioSource _audio;
  4. private void Start()
  5. {
  6. _audio = GetComponent<AudioSource>();
  7. }
  8. private void OnCollisionEnter2D(Collision2D collision)
  9. {
  10. if (collision.collider.CompareTag("Ball"))
  11. {
  12. //修改音量
  13. _audio.volume = 0.6f;
  14. //获取随机播放音效的音调
  15. _audio.pitch = Random.Range(0.8f, 1.2f);
  16. _audio.Play();
  17. }
  18. }
  19. }
csharp
运行

 

同理为PlayerController.cs 添加如下方法 并添加hit音效

  1. //OnCollisionEnter2D方法用于碰撞检测,is trigger不能勾选
  2. //当发生碰撞时,将碰撞到的物体Collider信息存储在Collision中
  3. private void OnCollisionEnter2D(Collision2D collision)
  4. {
  5. if (collision.collider.CompareTag("Ball"))
  6. {
  7. _audio.pitch = Random.Range(0.8f, 1.2f);
  8. _audio.Play();
  9. }
  10. }
csharp
运行

07 发布PC端

File-BuildSettings 点击Build完成打包,注意打包出的文件要放在同一个文件夹内

 

做完后,叫上你的小伙伴一起来玩吧!喜欢我的分享就关注我吧!以后会陆续分享案例教程的!

 

素材及工程文件百度云链接:链接:https://pan.baidu.com/s/1eT5iCcM 密码:s5w5


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空