【Unity2D入门教程】简单制作一个弹珠游戏之制作场景①(开场,结束,板子,球)

学习目标:

看过我前面的文章应该知道怎么制作开头和结尾,这里我简单把效果给大伙看一下

我用的游戏分辨率是4∶3,因此我们要改变Canvas的的Cavans Scale为X1440 Y1080

结束的场景也一样

接着我们编写一个脚本来管理场景的切换,创建一个空物体SceneLoader并将脚本

LoadSceneManage挂载到上面,并在按钮上挂载这些Public函数(我之前的入门文章有教程)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LoadSceneManage : MonoBehaviour
{
    public void LoadNextScene()
    {
        int currentScene = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene(currentScene+1);
    }
    public void RestartScene()
    {
        SceneManager.LoadScene(0);
        FindObjectOfType<GameStatus>().ResetGame();
    }
    public void QuitGame()
    {
        Application.Quit();
    }
}

 

学习内容:

  接下来的内容才是重量级,教大家如何搭建好一个关卡场景

我们先创建一个Scene就叫Level1吧

先从Github中下载好素材:Commits · CompleteUnityDeveloper/05-Block-Breakericon-default.png?t=N7T8https://github.com/CompleteUnityDeveloper/05-Block-Breaker/commits?author=rickdavidson

然后再import把素材导入到Project面板中

别忘了修改Sprite图片的Pixel Per Unit

 然后把场景拖进来并Reset改好名字叫Background

创建好板子Paddle和Ball

创建好Paddle.cs脚本挂载在Paddle上

脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Paddle : MonoBehaviour
{
    [SerializeField] float minX = 1F;
    [SerializeField] float maxX = 14F;
    [SerializeField] float screenWidthInUnits = 16f;

    GameStatus theGameSession; //管理UI更新(待会用上)
    Ball theBall;
    void Start()
    {
        theGameSession = FindObjectOfType<GameStatus>();
        theBall = FindObjectOfType<Ball>();
    }
    void Update()
    {       
        Vector2 paddlePos = new Vector2(transform.position.x,transform.position.y);
        paddlePos.x = Mathf.Clamp(GetXPos(), minX, maxX); //限制板子移动的X范围
        transform.position = paddlePos;        
    }

    private float GetXPos()
    {
        if (theGameSession.IsAutoBackEnabled()) //当系统AI自动操作时
        {
            return theBall.transform.position.x;
        }
        else
        {
            return Input.mousePosition.x / Screen.width * screenWidthInUnits;//相当于鼠标移动的x轴的坐标乘以整个游戏屏幕的宽度得到它的世界坐标
        }
    }
}

 

给个Polygon Collider2D

 然后再编写Ball的脚本

Ball.cs如下:

using UnityEngine;

public class Ball : MonoBehaviour
{
    [SerializeField] Paddle paddle1; //选择你要绑定的板子
    [SerializeField] float xPush = 2f;
    [SerializeField] float yPush = 15f;
    [SerializeField] bool hasStarted = false;

    AudioSource myAudioSource;
    [SerializeField] AudioClip[] ballSounds;

    [SerializeField] float randomFactor = 0.5f;

    Rigidbody2D myRigibody2D;
    Vector2 paddleToBallVector;

    void Start()
    {
        myRigibody2D = GetComponent<Rigidbody2D>();
        myAudioSource = GetComponent<AudioSource>();
        paddleToBallVector = transform.position - paddle1.transform.position; //获取球和板子的向量方向
    }

    void Update()
    {
        if (!hasStarted) //当游戏还没有开始时就每帧执行
        {
            LockBallToPaddle();
            LaunceOnMouseClick();
        }
    }
    private void LockBallToPaddle() //游戏刚开始要把球绑到板子中间上面随着板子移动
    {
        Vector2 paddlePos = new Vector2(paddle1.transform.position.x, paddle1.transform.position.y);
        transform.position = paddlePos + paddleToBallVector;
    }
    private void LaunceOnMouseClick()
    {
        if (Input.GetMouseButtonDown(0)) //通过点击鼠标左键发射,hasStart设置为true,并给它一个向上的力
        {
            hasStarted = true;
            GetComponent<Rigidbody2D>().velocity = new Vector2(xPush,yPush);
        }
    }

    private void OnCollisionEnter2D(Collision2D other)
    {
        Vector2 velocityTwek = new Vector2(Random.Range(0, randomFactor), Random.Range(0, randomFactor));//随机的速度
        if (hasStarted)
        {
            AudioClip clip = ballSounds[Random.Range(0, ballSounds.Length)];
            myAudioSource.PlayOneShot(clip); //播放一遍音频
            myRigibody2D.velocity += velocityTwek; //为了防止球一直做减速移动,要在给它每次和砖块碰撞的时候添加一个随机速度
        }
    }
}

别忘了给它碰撞体和重力,初次之外我们还有一个弹力就用Physice Material 2D

Friction为摩擦力,Bounceness为弹力

 我们还要创建一个Audio Source组件让他在发射和碰撞时发出声音,并把素材的音频文件拖到Ball Sounds的数组中


我会在下一篇继续教大伙怎么搭建Level

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Java撞墙随机变色,你可以使用Java Swing或JavaFX来实现一个简单的GUI,然后在界面上绘制一个和墙壁,当小碰到墙壁时,可以随机生成一个颜色来改变小的颜色。具体实现可以参考以下步骤: 1. 创建一个Java Swing或JavaFX的窗口,可以使用JFrame或JavaFX的Stage类来实现。 2. 在窗口上绘制一个和墙壁。可以使用Java 2D Graphics API 或JavaFX的Canvas类来进行绘制。 3. 实现小的运动逻辑,可以使用定时器(Timer)或JavaFX的AnimationTimer类来定时更新小的位置和速度。同时,可以判断小是否碰到了墙壁,如果碰到了,则随机生成一个颜色来改变小的颜色。 4. 实现随机生成颜色的逻辑,可以使用Java的Random类来生成随机数,然后将随机数转换成RGB颜色值。 关于Unity制作发射小撞墙游戏,可以参考以下步骤: 1. 创建一个3D场景,可以使用Unity的Scene视图来进行场景编辑。 2. 在场景中创建一个发射器和一个,可以使用Unity的GameObject来创建对象。 3. 实现小的运动逻辑,可以使用Unity的刚体(Rigidbody)组件来控制小的运动,同时可以使用碰撞器(Collider)来检测小是否碰到了墙壁。 4. 实现发射器的控制逻辑,可以使用Unity的输入(Input)系统来监听玩家的输入,然后控制发射器发射小。 5. 实现随机变色的逻辑,可以在小碰到墙壁时,随机生成一个颜色,并将颜色应用到小的材质(Material)上。 以上是两种不同的实现方法,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值