游戏开发-2022-10-17-疯狂弹球初级版

游戏引擎: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的简单使用_天策府狼崽子的博客-CSDN博客_unity vector3

4.2 RaycastHit2D 和 Physics2D.Raycast

向场景中的碰撞体投射射线。从概念上说,射线投射 类似于从空间中的某个点朝特定方向发射一条光束。在该过程中,可以检测并报告与光束接触的任何对象。函数返回一个 RaycastHit 对象,该对象引用了射线命中的碰撞体(如果未命中任何对象,则结果的碰撞体属性将为 NULL)。layerMask 可用于仅在特定层上有选择地检测对象(例如,这让您能够仅将检测应用于敌人角色)。

UnityEngine.RaycastHit2D - Unity 脚本 API

Physics2D-Raycast - Unity 脚本 API

4.3 Transform

Transform是Unity中一个重要的类,用来控制物体的位置、旋转、缩放。

Unity编码篇 Transform类

https://www.jianshu.com/p/145d18c7e574

https://www.jianshu.com/p/c3975f0162be

五、遇到的问题

很奇怪,当我使用Unity 2021.3.11f1c2创建该项目的时候,代码与步骤都与此篇相同,但是,当当在小球脚本中使用RaycastHit2D 和 Physics2D.Raycast时,碰到墙体也无法获取一个值,也就是无法进行反弹操作,无论是墙和球的模块,或者是设置中有关2d物理的设置,都没有问题,但是就是找不到是什么原因导致的,使用了2020编译以后就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值