65.9K
CodeProject 正在变化。 阅读更多。
Home

BreaknBounce

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (8投票s)

2013年7月26日

CPOL

14分钟阅读

viewsIcon

29304

downloadIcon

1144

触摸、 移动和改变游戏对象。

引言

  • 平台: Windows 8 桌面
  • 类别:- all-in-one  游戏
  • 名称:-BreaknBounce

概述

游戏的一个简单想法是触摸物体,看到它们分裂并再次破碎。

游戏包含在我们可以与之交互的空间中的物体。游戏包含 3 个可玩物体和一个静态物体平面。现在,我们的关注点是将物体放置在我们可以看到它们的地方,或者将它们从平面移开,让它们落下。这款游戏支持多点触控,并且可以轻松安装在平板电脑和一体机上。整个游戏将为用户提供关于触摸在设备中如何工作的绝佳体验。  

加速度计输入的游戏行为的示意图。 

游戏对象 

  1. 球体
  2. 立方体
  3. 胶囊
  4. 平面

如图所示

现在是关键 

游戏将物理学付诸实践,并允许用户与之交互。物体被分解成性质相同的更简单物体这一简单概念正在生效。每次与物体交互时,都会形成一种不同的颜色。 

交互的关键输入

目前,该游戏支持多点触控和加速度计,请玩提供的演示来体验游戏的潜力。游戏如何编译

正在进行中的工作:- 

1) NFC 可在两台设备之间连接和玩耍

需要找到将 Windows.Networking.Proximity dll 文件附加到 Unity 的方法。一个 GUI 按钮可用于与其他设备交互。 

由于联想一体机不支持 NFC,我将放弃这个想法

2) 一个 GUI 界面屏幕来关闭应用程序。 

3) 摄像头集成到游戏对象中,使其更具趣味性。 

4) 集成陀螺仪到应用程序中 **已测试** 我将在后期实现。 

5) 集成 Intel Perceptual SDK,附加到游戏中的其他场景,以便通过 GUI 按钮切换到使用 Intel Perceptual SDK 的游戏机制。 

现在下载可执行文件,通过触摸、点击、倾斜来体验。已在 Ultrabook 上测试。当球体或球状物体破碎成更小或极小的部分时,加速度计传感器效果最佳。观察球体跳出视线,然后随着屏幕移动而重新进入游戏。 

游戏截图:- 

Unity 中的初始项目文件

游戏截图 1

截图 2

截图 3

背景

我一直觉得人们喜欢触摸物体,看着它们以不同的颜色展现活力。这会让他们脸上露出喜悦,这就是我的工作理念。

使用代码

我将简要介绍 Unity 中实现的 Cube 的代码。这段代码用于获得游戏对象的破碎或分裂效果。

Breaker.cs

//
// using UnityEngine;
using TouchScript.Gestures;

public class Breaker : MonoBehaviour
{
    public Transform CubePrefab;
    public float Power = 10.0f;

    private Vector3[] directions = {
                                       new Vector3(1, -1, 1),
                                       new Vector3(-1, -1, 1),
                                       new Vector3(-1, -1, -1),
                                       new Vector3(1, -1, -1),
                                       new Vector3(1, 1, 1),
                                       new Vector3(-1, 1, 1),
                                       new Vector3(-1, 1, -1),
                                       new Vector3(1, 1, -1)
                                   };

    private void Start()
    {
        GetComponent<tapgesture>().StateChanged += HandleStateChanged;
    }

    private void HandleStateChanged(object sender, TouchScript.Events.GestureStateChangeEventArgs e)
    {
        if (e.State == Gesture.GestureState.Recognized)
        {
            if (transform.localScale.x > 0.05f)
            {
                Color color = new Color(Random.value, Random.value, Random.value);
                for (int i = 0; i < 8; i++)
                {
                    var c = Instantiate(CubePrefab) as Transform;
                    c.parent = transform.parent;
                    c.name = "Cube";
                    c.localScale = 0.5f*transform.localScale;
                    c.position = transform.TransformPoint(c.localScale.x/10.0f*directions[i]);
                    c.rigidbody.velocity = Power*Random.insideUnitSphere;
                    c.renderer.material.color = color;
                }
            }
            Destroy(gameObject);
        }
    }
}

//

我第一次混合使用 C# 和 JavaScript 编码语言。

这段代码显示了如何处理加速度计输入

Accel.js

//
#pragma strict
var speed = 10.0;

function Start () {

}

function Update () {
var dir : Vector3 = Vector3.zero;
 
// we assume that device is held parallel to the ground
// and Home button is in the right hand
 
// remap device acceleration axis to game coordinates:
// 1) XY plane of the device is mapped onto XZ plane
// 2) rotated 90 degrees around Y axis
dir.x = -Input.acceleration.y;
dir.z = Input.acceleration.x;
 
// clamp acceleration vector to unit sphere
if (dir.sqrMagnitude > 1)
dir.Normalize();
 
// Make it move 10 meters per second instead of 10 meters per frame...
dir *= Time.deltaTime;
 
// Move object
transform.Translate (dir * speed);

}

用于生成对象的脚本

spawner.cs

//
using TouchScript.Gestures;
using UnityEngine;
using System.Collections;

public class Spawner : MonoBehaviour
{
    public Transform CubePrefab;
    public Transform Container;
    public float Scale = .5f;

    private void Start()
    {
        GetComponent<tapgesture>().StateChanged += HandleStateChanged;
    }

    private void HandleStateChanged(object sender, 
             TouchScript.Events.GestureStateChangeEventArgs e)
    {
        if (e.State == Gesture.GestureState.Recognized)
        {
            var gesture = sender as TapGesture;
            RaycastHit hit;
            gesture.GetTargetHitResult(out hit);

            Color color = new Color(Random.value, Random.value, Random.value);
            var c = Instantiate(CubePrefab) as Transform;
            c.parent = Container;
            c.name = "Cube";
            c.localScale = Vector3.one*Scale*c.localScale.x;
            c.position = hit.point + hit.normal * 2;
            c.renderer.material.color = color;

        }
    }
}

扩展我的项目

我一直在不断地升级我的项目,并且在实验和获得结果时感到很有趣。这篇更新的文章是我在项目进行时展示游戏如何进化的又一次尝试。更多内容敬请期待。我们开始吧……

可能的 EDICE 集成:- 

什么是电子骰子?

它是一款虚拟骰子,可以在应用程序中使用,就像您实际掷骰子一样,它将产生与掷普通骰子相同的效果。

有什么用?

应用程序可以轻松识别骰子投掷的结果,因此您可以将其用于您自己的效果。

如何在我的游戏中级使用它?

玩数字游戏:-

使用电子骰子的逻辑

每次投掷都会出现一个数字,您可以使用它在游戏关卡之间切换

可能的用途:-

  1.  当电子骰子投出数字 2 时,您可以为该应用程序添加一个事件监听器,该监听器可用于在游戏中更改关卡。 
  2. 现在,您可以在某个关卡中添加游戏逻辑,其中对象将与电子骰子同时动作,并在游戏中产生相同的效果,即骰子中的数字 3 会将物体分解成 3 块,以此类推。 
  3. 我们还可以使用它来切换游戏中的摄像机焦点,就像您在关卡中看到的那样,当球体落下时,您可以将摄像机焦点移近地面,只需投掷一次电子骰子即可。 
  4. 我还可以添加一个逻辑,当骰子上出现一个数字时,可以将游戏对象分割成与代表立方体的数字相同的块数。 

骰子中的数字 2 将游戏对象分成两块。 

图示说明了其工作原理。

  游戏逻辑已扩展到向量。示例代码片段显示了如何实现破碎效果来分割 

将其分成两块。 

骰子中的数字 2 将游戏对象分割成碎片

//
//private Vector3[] directions = {
                                       new Vector3(1, -1, 1),
                                       new Vector3(-1, -1, 1),
                                                         };
//

电子骰子中的数字 4 将游戏对象分割成 4 块

//
//    private Vector3[] directions = {
                                       new Vector3(1, -1, 1),
                                       new Vector3(-1, -1, 1),
                                         new Vector3(1, -1, 1),
                                       new Vector3(-1, -1, 1),
                                                                 };

使用当前项目进行实验

我正在对游戏进行一些小的更改,以利用联想的图形能力,

提供良好的观看体验。我正在扩展 **Seth Gibson 的 Flocking Unity 模型** 并添加

一个触摸传感器以及连接到源的球体的灯光效果。 

什么是群体行为?

**群体行为**是指一群鸟类(称为 群体)在 觅食或飞行时表现出的行为。这与鱼类的 群游行为、昆虫的 群集行为以及陆地动物的 群体行为有相似之处。

 

计算机科学模拟:-

为模拟鸟类的群体行为而开发的计算机模拟和数学模型通常也可以应用于其他物种的“群体”行为。因此,“群体”一词在计算机科学中有时也用于鸟类以外的物种。

模拟如何在 Unity 游戏中实现

该模拟涉及人工智能逻辑模拟,以保持对象绑定。它涉及

分离:-  转向以避免挤压本地的群体成员。

对齐:-  朝向本地的群体成员。 

内聚:-  转向朝向本地群体成员的平均位置(质心)。

我已将示例扩展到包含障碍物,这些障碍物会产生闪电效果并连接到中心。您可以触摸这些物体或障碍物并改变方向。 

障碍物脚本:-

//
//using UnityEngine;
using System.Collections;

public class LightningBolt : MonoBehaviour
{
    public Transform target;
    public int zigs = 100;
    public float speed = 1f;
    public float scale = 1f;
    public Light startLight;
    public Light endLight;
    
    Perlin noise;
    float oneOverZigs;
    
    private Particle[] particles;
    
    void Start()
    {
        oneOverZigs = 1f / (float)zigs;
        particleEmitter.emit = false;

        particleEmitter.Emit(zigs);
        particles = particleEmitter.particles;
    }
    
    void Update ()
    {
        if (noise == null)
            noise = new Perlin();
            
        float timex = Time.time * speed * 0.1365143f;
        float timey = Time.time * speed * 1.21688f;
        float timez = Time.time * speed * 2.5564f;
        
        for (int i=0; i < particles.Length; i++)
        {
            Vector3 position = Vector3.Lerp(transform.position, target.position, oneOverZigs * (float)i);
            Vector3 offset = new Vector3(noise.Noise(timex + position.x, timex + position.y, timex + position.z),
                noise.Noise(timey + position.x, timey + position.y, timey + position.z),
                noise.Noise(timez + position.x, timez + position.y, timez + position.z));
            position += (offset * scale * ((float)i * oneOverZigs));
            
            particles[i].position = position;
            particles[i].color = Color.white;
            particles[i].energy = 1f;
        }
        
        particleEmitter.particles = particles;
        
        if (particleEmitter.particleCount >= 2)
        {
            if (startLight)
                startLight.transform.position = particles[0].position;
            if (endLight)
                endLight.transform.position = particles[particles.Length - 1].position;
        }
    }    
}
//

更多游戏截图:-

下图显示了游戏中的退出按钮以及触摸点对象。 

正在处理另一个群体场景(正在进行中)如下图所示

此关卡演示的视频链接

视频链接展示了 Ultrabook 上的游戏演示,以及 GUI 如何在联想一体机上提供更好的外观和感觉以及良好的观看体验。 

良好的观看体验在联想一体机上。 

群体演示

我想添加到此关卡的功能

加速度计支持以及破碎效果仍在进行中。 

使用群体行为的游戏

半条命

用于游戏中看到的飞行的鸟类生物 

在电影中

蝙蝠侠归来

其中计算机生成的蝙蝠群和企鹅军队穿过哥谭市的街道。 

 

闪电关卡

在这里,您会发现游戏对象通过闪电般的效果连接到一个目标。当您触摸它们时,它们会再次破碎并落到地面。在这里,我将使用加速度计传感器与掉落的物体进行交互,并且**有使用电子骰子的空间,投掷一下,视角就会切换到连接到平面的辅助摄像机(我需要从联想获取电子骰子的 SDK 才能使其正常工作)**。

整个体验将是全新的,并将以创新的方式呈现给最终用户。

图示显示了当前状态

下图显示了游戏运行时的状态。 

另一个显示与对象破碎效果的图示。

此关卡的视频链接 

闪电效果

演示在 Ultrabook 上进行,因此将改善联想一体机的整体体验。

我目前正在考虑的事情

使其兼容 2 位玩家。

我所拥有的少量知识使我能够做到这一点。随着我学习更多,将会有更多更新。

我已包含游戏的另一个演示。 

使用智能手机控制游戏 

我将创建游戏的网页版本,以便您可以在一体机上玩游戏,同时您的

智能手机(Android 或 iOS 设备)将充当您的游戏控制器。 

它将如何工作?

它将通过让设备和一体机位于同一网络(同一子网)上来工作。

想象一下用手机控制球,这是可能的。使用

BrassMonkey SDK for Unity 即可实现。只需从 Google Play 商店下载应用程序或

Apple Store,您就可以开始使用了。 

一体机和应用程序正常工作的条件

i) 确保设备和主机都在同一子网中。因为

Brass Monkey 在本地网络上运行,iPhone、Android 和主机都必须连接到同一网络。这**不**意味着计算机必须无线连接。一个简单的检查方法是验证其 IP 地址的前三个数字是否匹配(例如 192.168.x)。此网络需要可访问互联网。 

ii) 防火墙

许多防火墙,特别是内置的 Windows 防火墙,在未获允许的情况下不允许网络通信。请务必接受所有提示以允许您的应用程序进行网络访问 - 您可能需要显式打开所有端口才能正常工作。 

下图所示

如何实现

  1. 从网络下载 BrassMonkey SDK 
  2. 复制到您自己的 Unity 项目
  3. 将 BrassMonkey Prefab 添加到 Unity 场景
  4. 从 BrassMonkey prefab 选项注册到 BrassMonkey 网站

 

5) 您将获得应用程序密钥和应用程序 ID,它是免费的。

 

6) 需要将您的项目保存为 Web Player 项目。我将把它托管在 Windows Azure 上。

然后您就可以开始了。 

Brass Monkey Unity SDK

这是一个免费版本,可以在项目中的任何地方使用。

Brass Monkey® SDK 使您的 Unity 游戏能够成为一个游戏控制台,支持多个游戏控制器设备同时连接。 这允许您使用一台计算机获得多人游戏体验。 唯一的要求是游戏控制器和游戏控制台计算机位于同一个 WIFI 网络上。 游戏控制器可以是任何 iOS 设备或 Android 设备。Brass Monkey® SDK 允许您从游戏控制器获取各种输入,并将命令发送到您的游戏控制器。 您可以访问加速度计信息并发送诸如振动之类的命令。 您可以为您的设备创建游戏控制器方案。 游戏控制器方案是您发送到设备并在设备屏幕上显示的图像集合。 包含一个可视化方案编辑器,用于创建这些方案。 有内置的控制器方案和自定义控制器方案。 客户控制器方案也可以是动态的,允许控制器在游戏过程中更改显示。 游戏控制器方案可以显示图片并具有按钮或其他控件,用于控制您的游戏。 SDK 管理着从这些设备获取输入。 您可以获取按钮按下事件并跟踪触摸,从而以许多富有创意的方式来控制您的游戏。 

控制器模式

它有 4 种模式

  1. 游戏手柄
  2. 文本模式
  3. 导航
  4. 保持

GamePad

要向用户显示自定义控件方案,您可以将设备设置为游戏手柄模式。这是设备的默认模式,只有在进入其他模式以处理菜单或其他具有不同控件模式的输入元素时才需要调用它。 

//
BMConnection.getInstance().SetControlMode(device, ControlMode.GamePad);

设备连接引用控制器设备 BMConnection 提供属性来访问您的设备。如果您只需要访问一个控制器,可以使用 BMConnection.ControllerDevice。如果没有任何设备连接,此属性将为 null。 

//
BrassMonkey.Devices.TouchDevice device = BMConnection.ControllerDevice;

如果您的应用程序有多个设备,则可以通过 BMConnection.ControllerDevices 数组属性来引用它们。ControllerDevice 实际上只是 ControllerDevices[0] 的引用。 

//
BrassMonkey.Devices.TouchDevice device = BMConnection.ControllerDevice[0];

设备状态如果您需要在设备可用、连接或断开连接时收到通知,您可以监听 BMConnection 的 DeviceStateChange 事件。 

//
BMConnection.getInstance().DeviceStateChange += new
BrassMonkey.IO.DeviceConnectionStateEvent(OnDeviceStateChange);
public void OnDeviceStateChange (INetConnection connection, BMDevice device, ConnectionState
fromState, ConnectionState toState)
{
switch(toState)
{
case ConnectionState.AVAILABLE:
case ConnectionState.CONNECTED:
case ConnectionState.DISCONNECTED:
break;
}
//

当发生以下任何状态时,都会触发此事件,从而使您可以轻松地在代码中处理断开连接和新可用设备。BrassMonkey/Demo Assets/SphereManager.cs 文件中可以看到如何执行此操作的示例。或者,您可以通过简单地调用以下方法来检查设备的状态; 

//
ConnectionState state = BMConnection.ControllerDevice.GetConnectionState();

游戏控制器选项控制器可以生成按钮事件或跟踪触摸。Brass Monkey 还支持您的 iOS 或 Android 设备的触摸功能。SDK 提供了一个事件驱动层来接收这些命令。设备的加速度计位置会发送到游戏控制器。设备还可以从游戏控制台接收振动命令。加速度要处理加速度,您可以通过调用以下方法简单地获得远程设备当前方向的 Vector3: 

//
Vector3 acceleration = BMConnection.ControllerDevice.acceleration;
//

触摸 iOS 设备最多可以跟踪 5 个并发触摸。Brass Monkey 在 TouchState 类中跟踪这些触摸的状态,以便您可以跟踪触摸的开始、移动和结束。每个触摸都被分配一个唯一的标识符,您可以使用它来监视位置和触摸的更新。在 Unity 的 update() 函数中,您可以访问触摸。 

//
TouchState[] touches = BMConnection.ControllerDevice.touches;

在所有更新之后,我有了游戏的两个版本。

1) 安装在一体机上的版本,您可以使用正常的触摸、加速度计、陀螺仪在一体机的大画布上玩游戏。随心所欲地打破球体。

2) 第二个版本通过托管在 Windows Azure 上的 Web 访问,并使您的智能手机成为游戏控制器。 

新增关卡

收集硬币关卡

在这里,您需要使用键盘和触摸来收集硬币。 

您将使用键盘按键上、下、左、右进行移动,并使用触摸进行

破碎效果。 

图示描绘了场景。 

游戏视频链接

LINK

尖刺球和原子球关卡 

为游戏增添不同的感觉,我们为游戏添加了不同的球体,一个是尖刺球,另一个是原子球,两者都具有分裂能力。 

尖刺球图示

尖刺球是尖锐的球体,与普通球具有相同的功能,但形状不同。 

原子球图示

原子球闪电效果游戏图片 1

第二个游戏图片

使用新加速度计脚本的游戏图片 3

  第四个游戏图片

尖刺球游戏图片

 另一个游戏图片

 

 游戏视频

链接 1

机器人凯尔关卡

机器人凯尔是一个通过分裂效应获取能量的机器人,您需要触摸并打破

机器人,并用闪电分裂。 

机器人凯尔如图所示

将有两个不同的关卡来展示机器人凯尔的能力。 

i) 机器人正常的破碎效果,您触摸机器人,机器人就会破碎。

开发截图

ii) 另一个关卡,机器人通过分裂获得能量并繁殖。它连接到一个

 

截图 2

 

 

这之后 Unity 的项目结构

游戏视频

正常破碎视频

链接 1

能量生成效应

链接 2

武士关卡

对武士士兵使用相同的破碎效果。 

游戏截图

 游戏视频链接

LINK

使用加速度计和飞行效果的脚本如下: 

 它是用 JavaScript 编写的。
//
#pragma strict
var speed : float = 10.0;

var filter : float = 5.0;

var maxX : float = 10.0;

var minX : float = -10.0;

var maxY : float = 10.0;

var minY : float = -10.0;

private var accel: Vector3;

function Start () {

}

function Update () {
Screen.sleepTimeout = SleepTimeout.NeverSleep;

accel = Vector3.Lerp(accel, Input.acceleration, filter * Time.deltaTime);

var dir = Vector3(-accel.y, accel.x, 0);

if (dir.sqrMagnitude > 1) dir.Normalize();

transform.Translate(dir * speed * Time.deltaTime);

var pos = transform.position;

pos.x = Mathf.Clamp(pos.x, minX, maxX);

pos.y = Mathf.Clamp(pos.y, minY, maxY);

transform.position = pos; 
}
//

球体入板 

另一个新增关卡,您需要触摸、分裂并打破球体,将其保持在板上。它使用

一体机的大画布以提供出色的效果,并且增加了加速度计支持。球体无论施加什么力都会留在板上。

您施加的力。

游戏截图 1

游戏截图 2

雷霆中的球体 

又一个新增关卡,您还可以选择让球体产生分裂效果。球体从一个源获得它们的雷霆效果。用触摸拖动球,分裂是主要目标。玩得开心!

游戏截图 1

游戏截图 2

游戏截图 3

 

一体机必玩游戏

  1. 适合一体机大画布的游戏。
  2. 不同关卡可供选择,适合所有年龄段。
  3. 完全触摸支持
  4. 良好的 GUI 体验
  5. 集成了 Facebook SDK,以便您可以在社交媒体上分享您的分数。 
  6. 智能手机用作游戏控制器来玩。 
  7. 添加了加速度计和陀螺仪功能。 
  8. 包括电子骰子支持。 

概要 

我一直在努力利用一体机的大画布,因此我的工作总是在不断进步。我花在思考一体机规格上的时间越多,我的想法就越多。项目中使用的所有素材在 Unity 中都可以免费获得,并且可以进行实验。我正在研究机器人的 Mecanim 动画,并希望能够集成它。仍然进行了很多实验,**请务必查看游戏视频,它们是真实的游戏画面**。下次更新前,再见……

更多更新即将推出。 

关注点

使用触摸、加速度计输入等与对象进行交互。 

历史

  • 已准备好版本 1.0 演示。 
  • 上传了第二个演示:文章更新了群体和闪电效果。 
  • 上传了第三个演示,展示了群体效果。 
  • 更新了使用智能手机作为游戏控制器的功能。 
  • 更新了游戏详情中的新关卡(引入了机器人凯尔)。 
  • 添加了具有不同球体类型可玩的新关卡。 
© . All rights reserved.