游戏引擎:Unity
编译版本:2020.3.40f1c1
VS2019
一、实现步骤
首先在unity中画出游戏界面,元素包含(玩家板,球,墙,砖块精灵)
如果想要实现游戏的初级功能,即玩家可以左右控制板移动,小球碰到墙和玩家板可以反弹,以及小球碰到砖块精灵,砖块可以消失,就需要给它们赋予模块以及脚本
二、模块添加
首先,给墙,砖块,玩家板添加Box Collider 2D模块,以及给小球具有刚性效应添加Rigidbody 2D模块.
三、赋予脚本
3.1玩家板脚本
对于玩家来说,板是可以左右移动的,并且移动的范围,速度,都要有所限制。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public float speed = 3; //横版移动的速度
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float x = Input.GetAxis("Horizontal");//获取横向输入
float move = x * speed * Time.deltaTime;
Vector3 pos = transform.position + new Vector3(move, 0, 0);
pos.x = Mathf.Clamp(pos.x, -2.7f, 2.6f);//限制的是位置
transform.position = pos;
}
}
3.2小球脚本
对于小球来说,小球的移动方向,速度,以及碰到Default图层的物体(砖块,玩家板,墙)以后,要能够反弹,而打到砖块精灵以后,砖块精灵要消失,这时候,需要给砖块添加一个标签Brick,即小球打到Default图层且具有Brick标签的物体就消失
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
public Vector3 dir = new Vector3(1,1,0);//只在平面移动
public float speed = 5;//小球速度
// Start is called before the first frame update
void Start()
{
dir = dir.normalized;
}
// Update is called once per frame
void Update()
{
transform.position += dir * speed * Time.deltaTime;
}
private void FixedUpdate()
{
RaycastHit2D hit = Physics2D.Raycast(transform.position,dir,0.125f+speed*Time.deltaTime,LayerMask.GetMask("Default"));//开始位置,方向,移动距离,碰到的图层
if(hit.transform!=null)//如果碰到了图层default,则
{
//Debug.Log("111111");
Vector2 v = Vector2.Reflect(dir, hit.normal);
dir = v.normalized;
if(hit.transform.CompareTag("Brick"))//如果打到的是带有Brick标签的,就调用砖块的脚本
{
Brick b = hit.transform.GetComponent<Brick>();
b.OnHit();
}
}
}
}
3.3砖块脚本
即触发脚本就自毁砖块
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Brick : MonoBehaviour
{
public void OnHit()
{
Destroy(gameObject);//被调用就销毁我自己
}
}
四、模块代码知识积累
4.1 Vector
Vector 表示向量、矢量的意思,含有大小和方向;
Unity基础(0)—— Vector3的简单使用_天策府狼崽子的博客-优快云博客_unity vector3
4.2 RaycastHit2D 和 Physics2D.Raycast
向场景中的碰撞体投射射线。从概念上说,射线投射 类似于从空间中的某个点朝特定方向发射一条光束。在该过程中,可以检测并报告与光束接触的任何对象。函数返回一个 RaycastHit 对象,该对象引用了射线命中的碰撞体(如果未命中任何对象,则结果的碰撞体属性将为 NULL)。layerMask 可用于仅在特定层上有选择地检测对象(例如,这让您能够仅将检测应用于敌人角色)。
UnityEngine.RaycastHit2D - Unity 脚本 API
Physics2D-Raycast - Unity 脚本 API
4.3 Transform
Transform是Unity中一个重要的类,用来控制物体的位置、旋转、缩放。
https://www.jianshu.com/p/145d18c7e574
https://www.jianshu.com/p/c3975f0162be
五、遇到的问题
很奇怪,当我使用Unity 2021.3.11f1c2创建该项目的时候,代码与步骤都与此篇相同,但是,当当在小球脚本中使用RaycastHit2D 和 Physics2D.Raycast时,碰到墙体也无法获取一个值,也就是无法进行反弹操作,无论是墙和球的模块,或者是设置中有关2d物理的设置,都没有问题,但是就是找不到是什么原因导致的,使用了2020编译以后就可以了。