一、屏幕坐标转换为世界坐标。

1.游戏逻辑,根据界面布局,将墙体控制到对应的位置;

vector3 position=Camer.main.ScreenToWorldPoint(new vetor2(Screen.));//得到最右上的点。

位置有了,解决大小。通过自身的BoxCollider中的size来设置墙体的大小。

设置墙体就很容易解决。

void ResetWall(){
rightWall = transform.Find ("rightWall").GetComponent<BoxCollider2D> ();
leftWall = transform.Find ("leftWall").GetComponent<BoxCollider2D> ();
upWall = transform.Find ("upWall").GetComponent<BoxCollider2D> ();
downWall = transform.Find ("downWall").GetComponent<BoxCollider2D> ();

//屏幕坐标转换世界坐标,自适应于不同屏幕的变化

Vector3 upWallPosition = Camera.main.ScreenToWorldPoint (new Vector2(Screen.width/2f,Screen.height));
upWall.transform.position = upWallPosition+new Vector3(0,0.5f,0);
float width= Camera.main.ScreenToWorldPoint(new Vector2(Screen.width,Screen.height)).x*2f;
upWall.size = new Vector2(width,1f);

downWall.transform.position = -upWall.transform.position;
downWall.size = upWall.size;

Vector3 position = Camera.main.ScreenToWorldPoint (new Vector2(Screen.width,Screen.height));
rightWall.transform.position = new Vector3 (position.x,0,0)+new Vector3(0.5f,0,0);
rightWall.size = new Vector2 (1, position.y * 2f);

leftWall.transform.position = -rightWall.transform.position;
leftWall.size = rightWall.size;
}

二、主角的控制

1.主要的亮点在于设置keyCode可以设置多个角色用于对战的游戏。2.通过刚体组件rigidbody.velocity(new vector2())来控制移动;

public class PlayerContrl : MonoBehaviour {
public KeyCode keyUp;
public KeyCode keyDown;
public float speed=10;

private Rigidbody2D rd;

private AudioSource audio;

// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody2D> ();
audio = GetComponent<AudioSource> ();

}

// Update is called once per frame
void Update () {
if (Input.GetKey (keyUp)) {
rd.velocity = new Vector2 (0, speed);
}
else if(Input.GetKey(keyDown)){
rd.velocity = new Vector2 (0, -speed);
}
else {
rd.velocity = new Vector2 (0,0);
}

}

void OnCollisionEnter2D(){
audio.pitch = Random.Range (0.8f,1.2f);
audio.Play ();
}
}

三、球自身的运动

1.球的运动用的是:rigidbody.AddForce(new Vcetor());方向是取随机数来可控制Random.Ranage();

2.在Update()控制球的速度变化不大。//(velocity.x<9&&velocity.x>-9&&velocity.x!=0)

//代码

public class Boll : MonoBehaviour {
private Rigidbody2D rd;
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody2D> ();
GoBoll ();
}
public void ResetBoll(){
transform.position = Vector3.zero;
GoBoll ();
}

void GoBoll(){
int number = Random.Range (0,2);//随机方向
if (number == 1) {
rd.AddForce (new Vector2 (100, 0));
} else {
rd.AddForce (new Vector2 (-100,0));
}
}

void OnCollisionEnter2D(Collision2D col){
if(col.collider.tag=="Player"){
//Debug.Log ("hit");
Vector2 velocity = rd.velocity;
velocity.y =( velocity.y + col.rigidbody.velocity.y)/2f;
rd.velocity = velocity;
}

if(col.gameObject.name=="rightWall"||col.gameObject.name=="leftWall"){
Gamemanage.instance.ChanageScore (col.gameObject.name);
}
}
// Update is called once per frame
void Update () {
Vector2 velocity = rd.velocity;
if(velocity.x<9&&velocity.x>-9&&velocity.x!=0){
if (velocity.x > 0) {
velocity.x = 10;
} else {
velocity.x = -10;
}
rd.velocity = velocity;
}
}
}

四、游戏的GameManage

1.学到是单例模式的运用;声明私有字段,设置可写属性。在Awake(){instance=this;}初始化。//就可在其他类中调用。

2.GameObject.Find().sendMessage("meoth");给游戏体发消息,调用它身上的方法。

3.碰撞检测的语法 void OnCollisionEnter2D(Collision2D col){

if(col.collider.tag=="tag"){

}

}

4.音频播放:

private AudioSource audio;

在Start()里audio=GetCompent<>(AudioSource);

在需要的地方调用audio.Play()等控制音频的方法。

代码:

//private static Gamemanage _instance;
public static Gamemanage instance{
get
{
return _instance;
}

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Gamemanage : MonoBehaviour {

//单例模式
private static Gamemanage _instance;
public static Gamemanage instance{
get
{
return _instance;
}
}
private BoxCollider2D rightWall;
private BoxCollider2D leftWall;
private BoxCollider2D upWall;
private BoxCollider2D downWall;

public Transform player1;
public Transform player2;

private int score1;
private int score2;

public Text score1Text;
public Text score2Text;

void Awake(){
_instance = this;
}
// Use this for initialization
void Start () {
ResetWall ();
ResetPlayer ();
}

// Update is called once per frame
void Update () {

}

public void ChanageScore(string name){
if (name == "leftWall") {
score2++;
} else if (name == "rightWall") {
score1++;
}
score1Text.text = score1.ToString ();
score2Text.text = score2.ToString ();
}

public void ResetBtOnClick(){
score1 = 0;
score2 = 0;
score1Text.text = score1.ToString ();
score2Text.text = score2.ToString ();
GameObject.Find ("Ball").SendMessage ("ResetBoll");
}

void ResetWall(){
rightWall = transform.Find ("rightWall").GetComponent<BoxCollider2D> ();
leftWall = transform.Find ("leftWall").GetComponent<BoxCollider2D> ();
upWall = transform.Find ("upWall").GetComponent<BoxCollider2D> ();
downWall = transform.Find ("downWall").GetComponent<BoxCollider2D> ();

//屏幕坐标转换世界坐标,自适应于不同屏幕的变化

Vector3 upWallPosition = Camera.main.ScreenToWorldPoint (new Vector2(Screen.width/2f,Screen.height));
upWall.transform.position = upWallPosition+new Vector3(0,0.5f,0);
float width= Camera.main.ScreenToWorldPoint(new Vector2(Screen.width,Screen.height)).x*2f;
upWall.size = new Vector2(width,1f);

downWall.transform.position = -upWall.transform.position;
downWall.size = upWall.size;

Vector3 position = Camera.main.ScreenToWorldPoint (new Vector2(Screen.width,Screen.height));
rightWall.transform.position = new Vector3 (position.x,0,0)+new Vector3(0.5f,0,0);
rightWall.size = new Vector2 (1, position.y * 2f);

leftWall.transform.position = -rightWall.transform.position;
leftWall.size = rightWall.size;
}

void ResetPlayer(){
Vector3 player1Position = Camera.main.ScreenToWorldPoint (new Vector3 (100,Screen.height/2,0));
player1Position.z = 0;
player1.transform.position = player1Position;
Vector3 player2Position = Camera.main.ScreenToWorldPoint (new Vector3(Screen.width-100,Screen.height/2,0));
player2Position.z = 0;
player2.transform.position = player2Position;

}
}

我跟着siki学Unity3D游戏开发——PongGame的更多相关文章

  1. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  2. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  3. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  4. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  5. Unity3D游戏开发之连续滚动背景

    Unity3D游戏开发之连续滚动背景 原文  http://blog.csdn.net/qinyuanpei/article/details/22983421 在诸如天天跑酷等2D游戏中,因为游戏须要 ...

  6. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  7. [Unity3D]Unity3D游戏开发3D选择场景中的对象,并显示轮廓效果强化版

    大家好,我是秦培,欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei. 在上一篇文章中,我们通过自己定义着色器实现了一个简单的在3D游戏中选取.显示物体轮廓的实例. 在文章 ...

  8. [Unity3D]Unity3D游戏开发之跑酷游戏项目解说

    大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.c ...

  9. [Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

    大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...

随机推荐

  1. 最短路径floy算法———模板

    #include<cstdio>int n,i[1000][1000];int main(){ scanf("%d",&n); for (int a=1;a&l ...

  2. 常见的DoDataExchange什么意思

    该函数中的代码是由ClassWizard自动加入的.DoDataExchange只有一个参数,即一个CDataExchange对象的指针pDX.在该函数中调用了DDX函数来完成数据交换,调用DDV函数 ...

  3. Dede修改文章默认标题长度,让标题全显示

    第一步首先你要进入dedecms后台,系统——系统基本参数——其他选项——文档标题最大长度——在这修改为200或更大(其实200应该是足够了). 第二步进入phpmyadmin,点击dede_arch ...

  4. HornetQ

    https://github.com/flsusp/http-queue https://github.com/sfr-network-service-platforms/hq-console htt ...

  5. Keil C51中函数指针的使用

    函数指针在C语言中应用较为灵活.在单片机系统中,嵌入式操作系统.文件系统和网络协议栈等一些较为复杂的应用都大量地使用了函数指针.Keil公司推出的C51编译器是事实上80C51 C编程的工业标准,它针 ...

  6. Latch-up 閂鎖效應 & 靜電放電模式

    * * Latch-up 閂鎖效應, 又稱寄生PNPN效應或可控矽整流器 ( SCR, Silicon Controlled Rectifier ) 效應. 在整體矽的CMOS 管下, 不同極性攙雜的 ...

  7. eclipse打开文件位置Open Explorer 插件

    ,OpenExplorer插件可以满足这个功能,可以到https://github.com/samsonw/OpenExplorer/downloads下载最新版本,将jar包放到eclipse的pl ...

  8. 【转】各个层次的gcc警告 #pragma GCC diagnostic ignored "-Wunused-parameter" --不错

    原文网址:http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __ ...

  9. Php开发完全跨站点跨域名单点(SSO)同步登录和注销

    From:http://www.cnblogs.com/JinkoWu/p/5056646.html 先来说说什么是单点登录(SSO).来自百科的介绍:SSO英文全称Single Sign On,单点 ...

  10. 【HDU1394】Minimum Inversion Number(线段树)

    大意:n次操作原串查询逆序数,求出所有串中最小的逆序数. 求逆序数属于线段树的统计问题,建立空树,每次进行插点时进行一次query操作即可.n次操作可以套用结论:如果是0到n的排列,那么如果把第一个数 ...