精华内容
参与话题
问答
  • unity3d打砖块源码

    千次阅读 2017-11-05 16:29:57
     *Shoot.cs public class Shoot : MonoBehaviour {  public GameObject bullet;  public float speed=5; // Use this for initialization void Start () { .../
    

    *Shoot.cs
    public class Shoot : MonoBehaviour {
        public GameObject bullet;
        public float speed=5;

    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
            if (Input.GetMouseButtonDown(0)) {
                GameObject b = GameObject.Instantiate(bullet, transform.position, transform.rotation);
                Rigidbody r = b.GetComponent<Rigidbody>();
                r.velocity = speed * transform.forward;//速度乘以时间=力
           
            }
    }
    }
    *Move.cs
    public class Move : MonoBehaviour {
        public float speed = 3;
    // Use this for initialization
    void Start () {

    }
    展开全文
  • 这是一个使用Unity3D制作打砖块游戏的十分详细的教程 十分适合初学者作为练习实例
  • Unity3D打砖块(一)

    千次阅读 2019-01-10 18:04:07
    本文将通过Unity3D 打砖块游戏来初步的了解和学习Unity。 1. 首先,让我们先创建一个打砖块的U3D项目(此处应该是软件已经安装好了); 2. 其次,我们了解下U3D主界面中最重要的五个子界面 分别是:场景(Sence),...

    开始学U3D,入门是比难的,不知道该从哪里入手,上网查了一些大神的博客,不同的人有不同的看法。本文将通过Unity3D 打砖块游戏来初步的了解和学习Unity。

    1. 首先,让我们先创建一个打砖块的U3D项目(此处应该是软件已经安装好了);
    创建项目
    2. 其次,我们了解下U3D主界面中最重要的五个子界面 分别是:场景(Sence),构建游戏的地方;层级(Hierarchy),场景中的游戏对象都列在这里。检测面板(Inspector),当前选中的资源或对象的设置,是一些变量和组件的集合;游戏(Game),演示窗口,仅在播放模式中演示;项目 (Project),一些资源的列表,和库的概念一样 。
    五大子界面
    3. U3D 工程目录介绍
    Assets // 存放资源的文件,例如模型、图片、声音及代码脚本等
    Library // 存放库文件、缓存文件、shader
    ProjectSettings // 工程设置文件
    Temp // 临时文件(程序关闭后,临时文件消除)

    4. 创建场景Scene
    场景默认Hierarchy下有Main Camera和Direction Light,除了默认的,用户可以右键添加其它的U3D自身提供的模型物体,还可以导入UI设计的模型。

    创建Scene的方式有三种。可以通过标题栏下的FILE中的create Scene去创建,也可以鼠标右键Project区创建,也可通过快捷键ctrl+N去创建。

    5. 如何操作视野?
    按住鼠标右键,左右摇摆是围绕整个Scene进行旋转;
    按住Alt+左键,可以看到物体上下左右整体的情况;
    鼠标中键按住,可以水平左右移动物体;
    快捷键F,重新定位模型物体;

    6. Unity中游戏物体的基本操作
    Main Camera 视野范围(模拟人眼);
    游戏物体可以进行层级的修改(改变父子级的关系)
    物体的基本操作(QWERT)

    globel与local的区别:
    local为物体自身坐标,而global为世界坐标;

    pivot与center 的区别:
    pivot 自身的中心点;center 物体整体视觉的中心点

    展开全文
  • 基于Unity3D打砖块游戏开发

    千次阅读 2014-11-25 15:23:59
    功能简介:3D打砖块小游戏,实现基本功能,在游戏中可以通过鼠标调节camera视角以及位置——左键+移动鼠标-水平移动;右键+移动鼠标-摄像头倾斜角度;滚轮-缩放镜头。 工程文件下载 游戏画面: 游戏基本代码...
    
    
    //说明:原文上传时间:2014-11-20 地址:http://blog.sina.com.cn/s/blog_6e302d8b0102v4du.html
    开发语言:C#
    开发平台:Unity3D4.5.5f1
    开发人员:
    王士溥:负责3D部分代码编写以及软件分析
    朱俊彰:负责基本代码编写以及测试
    计划:
    开发时间:2周
    功能简介:3D打砖块小游戏,实现基本功能,在游戏中可以通过鼠标调节camera视角以及位置——左键+移动鼠标-水平移动;右键+移动鼠标-摄像头倾斜角度;滚轮-缩放镜头。

    游戏画面:



    游戏基本代码:
    //Ball.cs
    using UnityEngine;
    using System.Collections;
    
    public class Ball : MonoBehaviour {
    
        public float maxVelocity = 20;//珠球最大速度.
        public float minVelocity = 15;//珠球最小速度.
    
    	void Awake () {
            rigidbody.velocity = new Vector3(0, 0, -18);//小球初始速度.
    	}
    
    	void Update () {
            //控制小球的速度在15—20之间.
            float totalVelocity = Vector3.Magnitude(rigidbody.velocity);//得到珠球的总的速度.
            if(totalVelocity > maxVelocity){
                float tooHard = totalVelocity / maxVelocity;
                rigidbody.velocity /= tooHard;
            }
            else if (totalVelocity < minVelocity)
            {
                float tooSlowRate = totalVelocity / minVelocity;
                rigidbody.velocity /= tooSlowRate;
            }
    		//print(rigidbody.velocity);
            //若珠球的z坐标小于-3,游戏结束.
            if(transform.position.z <= -3){            
                BreakoutGame.SP.LostBall();
                Destroy(gameObject);//消除游戏组件.
            }
    		//print (rigidbody.velocity);
    	}
    }
    

    //Block.cs
    using UnityEngine;
    using System.Collections;
    
    public class Block : MonoBehaviour {
    	/// <summary>
    	/// 触发器
    	/// </summary>
    	void OnCollisionEnter () {
            BreakoutGame.SP.HitBlock();
            Destroy(gameObject);//删除组件
    	}
    }
    

    //BreakoutGame.cs
    using UnityEngine;
    using System.Collections;
    
    public enum BreakoutGameState { playing, win, lost };//定义游戏状态.
    
    public class BreakoutGame : MonoBehaviour
    {
        public static BreakoutGame SP;
    	public Transform ballPrefab;//珠球.
    	private int totalBlocks;//总的方块数.
    	private int blocksHit;//已经击打的方块数.
        private BreakoutGameState gameState;//游戏状态.
    
    
    	public float ZoomSpeed = 10;
    	public float MovingSpeed = 0.5f;//移动速度.
    	public float RotateSpeed = 1;//旋转速度.
    	public float distance = 5;
    	
    
        void Awake()
        {
            SP = this;
            blocksHit = 0;
            gameState = BreakoutGameState.playing;
            totalBlocks = GameObject.FindGameObjectsWithTag("Pickup").Length;//得到所有的方块数.
            Time.timeScale = 1.0f;//设置传递时间为1 .
    		//SpawnBall();
        }
    
    	void Update(){
    		Quaternion rotation = Quaternion.identity;
    		Vector3 position;
    		float delta_x, delta_y, delta_z;
    		float delta_rotation_x, delta_rotation_y;
    		
    		//按下鼠标左键.
    		if(Input.GetMouseButton(0)){
    			delta_x = Input.GetAxis("Mouse X") * MovingSpeed;//获取x轴方向的鼠标运动增量,乘以相应的移动速度.
    			delta_y = Input.GetAxis("Mouse Y") * MovingSpeed;//获取y轴方向的鼠标运动增量,乘以相应的移动速度.
    			//rotation = Quaternion.Euler(0,transform.rotation.eulerAngles.y,0);//设置旋转的角度,存储在Quaternion中.
    			rotation.eulerAngles = new Vector3(0,transform.rotation.eulerAngles.y,0);
    			transform.position = rotation * new Vector3(-delta_x,0,-delta_y)+transform.position;
    			//Debug.Log(rotation);
    		}
    		//按下鼠标右键.
    		if(Input.GetMouseButton(1)){
    			delta_rotation_x = Input.GetAxis("Mouse X") * RotateSpeed;
    			delta_rotation_y = Input.GetAxis("Mouse Y") * RotateSpeed;
    			position = transform.rotation*new Vector3(0,0,distance)+transform.position;
    			transform.Rotate(0,delta_rotation_x,0,Space.World);
    			transform.Rotate(delta_rotation_y,0,0);
    			transform.position = transform.rotation * new Vector3(0,0,-distance)+position;
    		}
    		//滑动鼠标滚动条.
    		if(Input.GetAxis("Mouse ScrollWheel")!=0){
    			delta_z = -Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;
    			transform.Translate(0,0,-delta_z);
    			distance += delta_z;
    		}
    	
    	} 
    
    
    
    	/// <summary>
    	/// 初始化珠球
    	/// </summary>
        void SpawnBall()
        {
            Instantiate(ballPrefab, new Vector3(1.81f, 1.0f , 9.75f), Quaternion.identity);//实例化珠球.
        }
    	/// <summary>
    	/// 界面的渲染	
    	/// </summary>
        void OnGUI(){
    		GUILayout.Label("作者:朱俊璋、王士溥");
            GUILayout.Space(10);//添加空格.
            GUILayout.Label(" 己击打: " + blocksHit + "/" + totalBlocks);
    		//游戏开始/
    		if (GUI.Button(new Rect(0,150,80,30),"开始游戏")) {
    			SpawnBall();
    		}
    
            if (gameState == BreakoutGameState.lost)
            {
                GUILayout.Label("你输了!");
                if (GUILayout.Button("重新加载"))
                {
                    Application.LoadLevel(Application.loadedLevel);//重新加载关卡.
    
                }
            }
            else if (gameState == BreakoutGameState.win)
            {
                GUILayout.Label("你赢了!");
                if (GUILayout.Button("重新加载"))
                {
                    Application.LoadLevel(Application.loadedLevel);
                }
            }
        }
    	/// <summary>
    	/// 击打砖块
    	/// </summary>
        public void HitBlock()
        {
            blocksHit++;
            if (blocksHit%10 == 0) //每击打十个砖块生成新的珠球.
            {
                SpawnBall();
            }
            if (blocksHit >= totalBlocks)//游戏胜利.
            {
                WinGame();
            }
        }
    	/// <summary>
    	/// 珠球掉落
    	/// </summary>
    	public void LostBall()
    	{
    		int ballsLeft = GameObject.FindGameObjectsWithTag("Player").Length;//获得剩余珠球数.
    		if(ballsLeft<=1){
    			SetGameOver();//游戏结束.
    		}
    	}
    	/// <summary>
    	/// 游戏胜利
    	/// </summary>
        public void WinGame()
        {
            Time.timeScale = 0.0f; //设置游戏暂停.
            gameState = BreakoutGameState.win;
        }
    	/// <summary>
    	/// 游戏失败 
    	/// </summary>
        public void SetGameOver()
        {
            Time.timeScale = 0.0f; //设置游戏暂停.
            gameState = BreakoutGameState.lost;
        }
    }
    

    //Paddle.cs
    using UnityEngine;
    using System.Collections;
    
    public class Paddle : MonoBehaviour {
    
        public float moveSpeed = 20;
    
    	void Update () {
    		//获取水平方向,得到移动距离.
    		float moveInput = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
            transform.position += new Vector3(moveInput, 0, 0);
    		//控制板条移动范围.
            float max = 14.0f;
            if (transform.position.x <= -max || transform.position.x >= max)
            {
                float xPos = Mathf.Clamp(transform.position.x, -max, max); //板条移动的x坐标范围在-max和max之间.
                transform.position = new Vector3(xPos, transform.position.y, transform.position.z);
            }
    	}
    	/// <summary>
    	/// 增加小球碰撞后的水平速度,否则小球左右反弹的效果不理想。当珠球退出碰撞时调用该方法
    	/// </summary>
    	/// <param name="collisionInfo">Collision info.碰撞事件</param>
    	void OnCollisionExit(Collision collisionInfo ) {
    		Rigidbody rigid = collisionInfo.rigidbody;//得到我们碰撞的刚体.
    		float xDistance = rigid.position.x - transform.position.x;//碰撞的珠球与板条的水平距离,落到板条中间时,水平速度保持不变.
    		rigid.velocity = new Vector3(rigid.velocity.x + xDistance, rigid.velocity.y, rigid.velocity.z);//刚体碰撞后的速度.
    	}
    }
    



    开发展示:



    性能分析:
    基于Unity3D的打砖块游戏开发



    感想:
    这次作业与第一次作业有很大区别,这次实现的内容跟接近实际并且运用了当下流行的跨平台开发工具Unity3D。在开发过程中遇到了难题,如游戏中视角的移动来展示3D的效果。但最后我们两个人合力完成了这个小型项目,我也意识到了合作的重要性。后期可以继续拓展游戏的可玩性如增加关卡内容;增加游戏美观度。

    展开全文
  •  今天呢,我们来一起做一个怀旧版的经典游戏打砖块。相信每一个和博主同龄的人对于这个游戏都有着一种独特的情感吧。这个游戏是博主小时候掌上游戏机里面比较好玩的一个游戏,玩家需要通过控制屏幕下方的横条,通过...

          大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei

          今天呢,我们来一起做一个怀旧版的经典游戏打砖块。相信每一个和博主同龄的人对于这个游戏都有着一种独特的情感吧。这个游戏是博主小时候掌上游戏机里面比较好玩的一个游戏,玩家需要通过控制屏幕下方的横条,通过一个小方块来消灭屏幕上方的砖块,玩家每消灭一个砖块,就能够得到一定的分数,当消灭完整个屏幕上的方块后,即可进入下一关,而且屏幕下方的横条长度会增长。那么,关于这个游戏就暂且介绍到这里,我们下面开始今天的内容。

          一、游戏界面

         首先我们创建如下的游戏场景,这个游戏场景中我们使用一个Plane作为我们的游戏背景,我们将Plane的Rotation属性设置为90,180,0,使其与主摄像机垂直,我们将Plane命名为Background。接下来我们将主摄像机的投影方式改为正交投影,然后调整摄像机的视野范围,使我们的Background能够完全显示在游戏窗口中。

         接下来,我们创建一个Cube并调整其大小,它将作为我们的游戏体,玩家需要控制它来接住小球。我们将它命名为PlayBoard。同样地,我们创建一个小球,将其命名为PlayBall。我们需要将PlayBoard和PlayBall的z坐标设置为相同的值,即保证它们是在一个平面上。为了让小球具备弹性,我们可以导入官方提供的物理材质资源包,这里我们选择Bouncy材质。

           好了,到目前为止,我们的界面就已经完成了。下面我们来一起编写脚本实现脚本控制吧!

          二、脚本控制

          我们首先需要产生一组砖块。这里我们采用动态生成的方法,即先制作砖块的预设,然后根据预设克隆出新的砖块。预设在Unity3D中就是可复用的游戏体,使用预设可以减少内存资源的消耗。代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class CubeManager : MonoBehaviour {
    	
    	//定义第一个砖块的位置
    	private float StartX=-6.20F;
    	private float StartY=4.625F;
    	//定义砖块单元
    	public GameObject[] Units;
    	
    	
    	void Start () 
    	{
    	  //随机产生21x5个砖块
    	  for(int i=0;i<21;i++)
    	  {
    		for(int j=0;j<5;j++)
    		{
    		  //根据i*j的奇偶性产生不同的砖块对象
    		  GameObject UnitObject=null;
    		  if(i*j % 2==0)
    		  {
    			 UnitObject=Units[0];		
    		  }else
    		  {
    			 UnitObject=Units[1];
    		  }
    		  //克隆砖块
    		  Instantiate(UnitObject,new Vector3(StartX+i*0.625F,StartY-j*0.625F,-2),
    					Quaternion.Euler(new Vector3(90,180,0)));
    		}
    	  }
    	}
    }
    

          其中砖块对象是一个Plane的预设,我们这里准备了黑白两种颜色的Plane预设,这样画面的色彩不会显得单调,主要这里要加上刚体和碰撞器,我们设置其Tag为UnitCube。

          接下来,我们为白色横条编写脚本,在这段脚本中,横条只能在游戏界面内水平移动。代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class Operator : MonoBehaviour {
    	
    	//球板的移动速度
    	public float MoveSpeed=3.0F;
    	//移动球板
    	void Update () 
    	{
    	  if(Input.GetKey(KeyCode.A))
    	  {
    		 //当球拍未超过屏幕左侧时移动球拍,否则球拍不能再移动
    		 if(transform.position.x>-5)
    		 {
    	       transform.Translate(Vector3.left*Time.deltaTime*MoveSpeed);
    		 }else
    		 {
    		   transform.position=new Vector3(-5,transform.position.y,transform.position.z);
    		 }
    	  }
    	  if(Input.GetKey(KeyCode.D))
    	  {
    		 if(transform.position.x<5)
    		 {
    	       transform.Translate(Vector3.left*Time.deltaTime* (-MoveSpeed));
    		 }else
    		 {
    		   transform.position=new Vector3(5,transform.position.y,transform.position.z);
    		 }
    	  }
    	}
    }
    


         既然已经实现了对于横条的控制,那么我们接下来来实现小球的脚本,小球在游戏开始时会受到一个45度方向的力,这样小球就有了一个初速度,小球的反弹通过Unity的物理引擎来实现。当小球碰到砖块时,砖块将被销毁,玩家得到1分。当小球的位置低于横条的位置时,游戏结束。代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class Ball : MonoBehaviour {
    	
    	[HideInInspector]
    	//定义玩家得分
    	public int Grade=0;
    	//任务是否失败
    	public bool IsDroped=false;
    	
    	void Start () 
    	{
    	   //将球旋转45度并向上发射
    	   transform.Rotate(new Vector3(0,1,0) * 45);
    	   transform.forward=new Vector3(0,1,0) * 45;
    	   transform.rigidbody.AddForce(transform.forward*12F,ForceMode.Impulse);
    	}
    	
    	void Update () 
    	{
    	   //始终保证球与砖块在同一平面上
    	   transform.position=new Vector3(transform.position.x,transform.position.y,-2);
    	   //小球位置检测,低于球板位置时游戏结束
    	   if(transform.position.y<=-4)
    	   {
    		 //这里添加游戏结束的逻辑
    		 IsDroped=true;
    	   }
    	}
    	
    	void OnCollisionEnter(Collision mCollision)
    	{
    	  //当碰到砖块时,销毁砖块
    	  if(mCollision.gameObject.tag=="UnitCube")
    	  {
    		Destroy(mCollision.gameObject);
    		Grade+=1;
    	  }
    	}
    }
    

         好了,现在我们只需要把CubeManager脚本绑定在Background上,把Ball脚本绑定到小球上,把Operator脚本绑定到横条上,我们就可以运行游戏了 。

         运行游戏的过程中,我们会发现一个问题就是当小球移动到游戏界面的边缘时会消失。理论上在这个位置小球应该会反弹回来,怎么办呢?我们继续回到游戏界面,在界面的顶部、左侧、右侧分别创建一个和PlayBall、PlayBoard共面的Cube。我们同样为这个Cube设置一个弹性材质.

         到目前为止,这个游戏的核心部分已经全部讲解完毕。最后,我们做一个简单的游戏管理器GameManager来实现对玩家得分和游戏状态的更新:

    using UnityEngine;
    using System.Collections;
    
    public class GameManager : MonoBehaviour {
    	
    	private GUIText mGrade;
    	public GameObject Target;
    	
    	void Start () 
    	{
    	   mGrade=transform.GetComponent<GUIText>();
    	}
    	
    	void Update () 
    	{
    	   if(!Target.GetComponent<Ball>().IsDroped)
    	  {
    	     mGrade.text="得分:"+Target.GetComponent<Ball>().Grade.ToString();
    	  }else
    	  {
    		 mGrade.text="游戏结束,您的得分为:"+Target.GetComponent<Ball>().Grade.ToString();	
    	  }
    	}
    }
    

           其中,关于玩家的得分和游戏状态都在Ball脚本中定义,大家可以自己去查阅。好了,这就是今天的博客了,希望对大家有用、希望大家喜欢。

     

           每日箴言:不管是出于意愿还是无知,我们的成功和失败都不是别人招致的,而是自己决定的。——加思·斯坦

     

     

        喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei

        转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24719939


     

    展开全文
  • 最初的《打砖块》是在1986年发行的,虽然已经这么长时间了,但是仍然非常容易上瘾,由于它的街机风格的性质,它很容易在Unity中开发。 像往常一样,每件事件都会尽可能简单地解释,以便每个人都能理解。 下面是游戏...
  • Unity3D基础学习之打砖块

    千次阅读 2018-03-26 00:46:22
    Unity3D基础学习之打砖块基于unity20171) 使用Plane创建初始地图(层级菜单[Hierarcy]-> 3D Object -> Plane) 2) 将Plane命名为Gound3) 更改Scalex = 2,y = 2,z = 2,将Plane变为原来的两倍 4) 在Assest下新建一个...
  • unity3D__球打砖块

    2014-12-27 19:37:08
    欢迎大家关注我的日志,今天简单的介绍下球打砖块的项目: 所用技术: 循环 克隆 键盘操作 位移 刚体 1、 生成一行砖块 public GameObject wall; void Start () { for (int j = 0; j...
  • 初始Unity 3D——小Demo打砖块

    千次阅读 2016-11-30 13:20:31
    需求:鼠标点击墙壁,从观察者角度发射子弹,击中墙壁砖块。子弹在五秒钟后消失从小Demo中学习解决问题的逻辑思路: ...声明public变量,将砖块brick拖进去void CreateWall(){ for(int i=0;i;i++){ for(int j=
  • 前面实现了一个非常的简单打砖块小游戏,但可以发现里面有许多不合理的地方(特性) 一、优化:当方块掉下去的时候,到达一定高度后销毁它 给方块添加脚本如下即可: using System.Collections; using System....
  • Unity3D基础34:打砖块小游戏设计

    千次阅读 2019-02-06 19:48:21
    这里实现一个简单的“打砖块”小游戏,效果如下: 一、地面和墙壁 第一步:先创建一个"plane"平面和一个"Cube"方块如下,其中Cube添加物理组件,并存储预制体 材质球什么的就不用说了,...
  • 先让我们康康效果演示: 1.先创建地面和墙 地面和墙分别为Plane和Cube类型。 将Cube设置为Prefabs(预制体),添加刚体组件 添加材质给地面 ...我们要让子弹在相机的位置创建并发射,所以要给Main Camera添加一些...
  • 操作 效果 Alt+鼠标左键 以物体为中心,转动观察 选中物体ctrl+D 直接复制这个物体 按住ctrl移动物体 按指定方向移动一个单位 Input.GetMouseButtonDown(0) 检测是否鼠标按下 ...GameObject.Inst...
  • Unity3d开发学习笔记(一) 项目打砖块 Unity项目结构简介: Assets文件夹: 资源文件夹,用来存放所有用到的场景模型,贴图,声音,脚本等等一些文件。 Library文件夹: 储存一些快捷方式,暂存文件。 Project...
  • 说先看下运行之后的效果图 可以不断的从摄像机的位置发射出小球!去推倒墙体 这个写了三个脚本,都挂载在摄像机上面! 下载地址 首先看一下如何通过代码造出墙体出来 这里我们造出一个行列纵的一个墙体using ...

空空如也

1 2 3 4
收藏数 73
精华内容 29
热门标签
关键字:

unity3d打砖块