存档

‘unity3d’ 分类的存档

如何修改新建脚本模板-ScriptTemplates(Unity3D开发之十五)

2015年4月9日 没有评论

猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://blog.csdn.net/cocos2der/article/details/44957631

unity添加新脚本的时候,没有版权文件头信息,主要是没有脚本创建人的姓名,在项目开发中,如果想知道这个脚本是谁写的,呼来唤去搞半天才发现是自己写的!!!

用习惯了xcode,所以准备给unity的新建脚本添加一个信息头内容。

Unity自己就有新建脚本模板文件,但是这个文件里面的预定义key很少,不够咱们使用。所以需要自己添加几个key。然后在新建脚本的时候替换这个几个key为对应的内容。

一、修改模板文件

打开模板文件 Unity.app/Contents/Resources/ScriptTemplates/81-C# Script-NewBehaviourScript.cs.txt
修改为:

//
//  #SCRIPTNAME##FILEEXTENSION#
//  #PROJECTNAME#
//
//  Created by #SMARTDEVELOPERS# on #CREATIONDATE#.
//
//

using UnityEngine;
using System.Collections;

public class #SCRIPTNAME# : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

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

    }

}

上面的就是版权头信息,新建的脚本就这下面的效果了:

//
//  TestClass.cs
//  DomoJump
//
//  Created by YanghuiLiu on 04/09/2015.
//
//

using UnityEngine;
using System.Collections;

public class TestClass : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

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

    }

}

二、添加Editor脚本,用来解析上面我们自己添加的key

//
//  HEScriptKeywordReplace.cs
//  HEUnityExtensionLib
//
//  Created by YanghuiLiu on 04/09/2015.
//
//

using UnityEngine;
using UnityEditor;
using System.Collections;

public class HEScriptKeywordReplace : UnityEditor.AssetModificationProcessor {
    public static void OnWillCreateAsset ( string path ) {
        path = path.Replace(".meta", "");
        int index = path.LastIndexOf(".");
        string file = path.Substring(index);
        if (file != ".cs" && file != ".js" && file != ".boo") return;
        string fileExtension = file;

        index = Application.dataPath.LastIndexOf("Assets");
        path = Application.dataPath.Substring(0, index) + path;
        file = System.IO.File.ReadAllText(path);

        file = file.Replace("#CREATIONDATE#", System.DateTime.Now.ToString("d"));
        file = file.Replace("#PROJECTNAME#", PlayerSettings.productName);
        file = file.Replace("#SMARTDEVELOPERS#", PlayerSettings.companyName);
        file = file.Replace("#FILEEXTENSION#", fileExtension);

        System.IO.File.WriteAllText(path, file);
        AssetDatabase.Refresh();
    }
}

三、设置PlayerSettings的属性

点击Edit/Project Settings/Player,修改Company Name为所需要的名字。

OK,你也可以自己根据需求自己修改了。

分类: unity3d 标签:

Orientation Auto Rotation旋转屏幕crash问题(Unity3D开发之十四)

2015年3月8日 没有评论

猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!

原文地址: http://blog.csdn.net/cocos2der/article/details/44133127

今天运行一个场景时候,welcome场景可以旋转,进入主场景后发现只要旋转手机屏幕就会crash。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'UnityDefaultViewController should be used 
only if unity is set to autorotate'

出错信息已经显示是使用auto rotation导致的。

Unity Build setting里面已经是Auto Rotation,为何主场景无法旋转?

而且错误表示:是我在调用autorotate,但是我设置的模式却不是autorotate。

最后全局搜索了下,果然有测试代码手工设置了屏幕方向为Left。修改为自动后,问题解决。

Screen.orientation = ScreenOrientation.AutoRotation;

问题虽然是个小问题,但是想起了那谁谁前天线上游戏由于开发写的测试代码跑到线上,导致玩家多了一个装了很多道具的宝箱。

所以,谁要是说:”这个功能先这样就好了, 等正式配置出来了,我在修改。“,我保证不掐死你…

分类: unity3d 标签:

Unity3d 杂七杂八小技巧

2015年2月28日 没有评论



用了半年多的Unity3d,零零碎碎的记了点东西,先前记在个人博客里 ,后来网站改版给删了,现在发这吧 都是我实际用过的,至少在某个版本力是杠杠给力的 Unity3d 杂七杂八小技巧 ,谁用谁知道 Unity3d 杂七杂八小技巧

1、自定义编辑器

1.1、自定义菜单栏

using UnityEditor

[MenuItem ("aaa/bbb")] //必须有子菜单
static void function_called()
{

}

[MenuItem ("aaa/bbb"),true] //已经选中目标为true
static void called_again()
{

}

1.2、自定义组件菜单

using UnityEngine;
using UnityEditor;

//添加该脚本至组件菜单栏中
[AddComponentMenu("aaa/bbb")]
class menuExt : MonoBehaviour {
    
    void Update()
    {
        //自身旋转
        transform.Rotate(0.0f,Time.deltaTime * 200,0.0f);   
    }
}

2、角色控制器

第一人称 & 第三人称 import Package->Character Controller

控制器组件 component->physics->Character Controller然后使用GetComponent<CharacterController>()

控制器方法:

//平面移动
controller.SimpleMove();
//立体移动
controller.Move();

//碰撞中的状态
controller.collisionFlgas == CollisionFlags.Sides

//碰撞会回调
void OnControllerColliderHit(ControllerColliderHit hit)
{
    //碰撞的游戏对象为 hit.gameObject
}

3、工具类

3.1时间

void OnGUI()
{
    GUILayout.Label("当前游戏时间:" + Time.time);
    GUILayout.Label("上一帧所消耗的时间:" + Time.deltaTime);
    GUILayout.Label("固定增量时间:" + Time.fixedTime);
    GUILayout.Label("上一帧所消耗固定时间:" + Time.fixedDeltaTime);
}

3.2等待

waitForScends()可以直接让游戏主线程等待,不过需要修改返回值为IEnumerator。这岂不是很烂?

3.3随机数

Random.Range(startNum,endNum);

4、射线

Ray ray = new Ray(startPos,endPos)
//从摄像机到鼠标之间的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePositon)

RaycastHit hit;

//与游戏中的对象相交返回true
if(Physics.Raycast(ray,out hit,num))
{
}

5、点击事件

鼠标键位:左键0,右键1,中建2

//按下
Input.GetMouseButtonDown(num)
//取位置
Input.mousePosition
//抬起
Input.GetMouseButtonUp(num)
//长按
Input.GetMouseButton(num)

6、自定义按键事件

按键事件 Input.GetAxis(InputName)

Edit->Project Settings->Input更改数量Input.GetButton(SelfInputName),返回同点击事件。

7、取子节点

foreach (Transform child in obj.transform) 
{
    child.gameObject.SetActive(b);
}

如果你觉得这篇文章对你有帮助,可以顺手点个,不但不会喜当爹,还能让更多人能看到它… Unity3d 杂七杂八小技巧

分类: unity3d 标签:

Unity3d 在 iOS 上推送( push notification ) 编写

2015年2月26日 没有评论



配置证书

先按照这个生成一大堆证书 http://www.cnblogs.com/gpwzw/archive/2012/03/31/apple_push_notification_services_tutorial_part_1-2.html

其中输入的命令有些错误,可以参考 http://www.tuicool.com/articles/vy2MbmZ

openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
cat PushChatCert.pem PushChatKey.pem > ck.pem

配置好证书后,在UnityAppController.mm中的 didFinishLaunchingWithOptions函数添加:

    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
        if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
            // use registerUserNotificationSettings
            [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
            
            [application registerForRemoteNotifications];
        } else {
            // use registerForRemoteNotifications
            [application registerForRemoteNotificationTypes:
             (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
        }
    #else
        // use registerForRemoteNotifications
        [application registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
    #endif

这样就完成了对注册的配置,对于Unity3d自带的注册,应该是不兼容IOS8系统

	function Start() {
			NotificationServices.RegisterForRemoteNotificationTypes(RemoteNotificationType.Alert | 
										RemoteNotificationType.Badge | 
										RemoteNotificationType.Sound);
		}
	function Update () {
		if (!tokenSent) {
			var token : byte[] = NotificationServices.deviceToken;
			if (token != null) {
				// send token to a provider
				var hexToken : String = "%" + System.BitConverter.ToString(token).Replace('-', '%');
				new WWW("http://"+address+"/?token="+hexToken);
				tokenSent = true;
			}
		}
	}

如果使用Unity3d可以在didRegisterForRemoteNotificationsWithDeviceToken函数中加入

NSString *tokenStr = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
tokenStr = [tokenStr stringByReplacingOccurrencesOfString:@" " withString:@""];
UnitySendMessage("Bridge", "onPushID",tokenStr.UTF8String);
另外就是使用update来处理token也是不可行的。

获取token成功后,更改didRegisterForRemoteNotificationsWithDeviceToken函数,添加一个消息发送回unity3D,将结果发送给服务器。 我觉得可以使用一个单例,把整个这一套东西抽象出来,回头有功夫整理一下。

如果你觉得这篇文章对你有帮助,可以顺手点个,不但不会喜当爹,还能让更多人能看到它… Unity3d 在 iOS 上推送( push notification ) 编写

分类: unity3d 标签: ,

Unity3D研究:Unity3D引擎架构设计

2015年1月22日 没有评论

组件(Component)这个概念最早是在2005年《Game Programming Gems 5》的《Component Based Object Management》中接触到的,当时感觉在设计上很实用。后来,发现Unreal Engine 3的一个重要的改进就是抛弃了以前的基于纯派生关系的对象
模型 ,而转为使用
基于组件
的对象 模型 。对于这种设计思想,Unity比Unreal贯彻的更彻底——一切皆Component。

那么到底什么是“基于组件”的对象 模型 ?它能够解决什么问题?

在传统的设计中,我们一般会使用“派生”来描述对象之间的关系。子类通过派生父类,来获得父类的功能。在设计游戏对象时,会根据游戏本身的需要而为游戏对象添加各种功能支持,比如渲染,碰撞,刚体,粒子系统等等。这些通用功能为了能够为各种派生类提供服务,都必须实现到基类中。这样就导致了游戏对象基类变得非常庞大臃肿,即难使用,又难维护。

”基于组件“的对象 模型 就是把所有需要提供给游戏对象的基础功能都独立成单独的”组件模块“(Component),一个具体的游戏对象可以将它需要的功能模块组合到一起使用。所有”功能“不再是父类中的接口,而变成子对象实例,为游戏对象提供服务。这样既保证了功能代码的可重用性,又增加了整个对象体系的模块化和灵活度。

在Unity中,GameObject除了作为Component的容器之外,基本上没有其他功能。所有需要的功能都要通过组合Component来实现。脚本本身也是Component,用来在GameObject上通过控制其他Component来实现自定义的功能。虽然这些Component在物理上是完全并列的关系,但是他们之间还是会有一定的层次关系的。在设计一个游戏对象的具体功能时,组件一般会被分为三个层次。

引擎的基础组件

Unity本身提供的各种内部功能组件。比如渲染组件,物理组件,声音组件等等。这些组件实现了所有引擎提供的基础功能,会被脚本使用来组合高级功能。

模块功能脚本组件

通过脚本实现的一些相对独立的通用模块功能的组件。这类 组件的设计 是脚本可重用的关键,需要仔细分析游戏对象中哪些功能可以被独立出来成为一个可重用的功能模块组件,并且在实现上应该尽量降低与其他组件的耦合性。比如在设计一个角色游戏对象时,需要为他设计换装功能。换装功能其实就是对显示子对象进行分组管理,切换显示状态。这个功能相对独立,与其将他实现到角色中,不如独立成一个功能模块组件。角色游戏对象和其他所有需要换装功能的游戏对象都可以通过包含这个模块组件来实现换装功能。

模块功能组件之间还可能有依赖关系,也就是一个功能模块组件可能依赖与另一个功能模块组件,从而在这个组件层次上形成更多的子层次。

高层的胶水代码脚本

这些脚本用来真正将引擎基础组件和模块功能组件组合到一起实现最终游戏对象逻辑。用“胶水代码”来形容这些脚本非常的贴切,就是把所有这些子功能“粘”在一起。比如设计一个Player脚本,将所有需要的组件功能组合起来,实现一个玩家的具体游戏逻辑。因为这一层次代表的都是最高层的游戏行为控制对象,是具体的游戏逻辑的“胶水”代码,不会再为更上层提服务,所以本身的可重用性并不高。但是这些对象之间按照类型区分,往往会有一些功能上的重合,所以反而可以继续使用派生关系来实现功能的重用。比如在Character中实现所有的基础功能(这些功能又是通过组合基础组件来实现的),而Player和NPC都从Character派生,来继承所有Character的功能,并继续实现自己特殊的功能。一个功能到底应该用组件实现还是用派生实现并没有非常明确的界限,应该根据需要灵活运用。

在使用Unity的过程中,如果要实现的是demo级别的小工程,并不需要考虑很多,直接用脚本实现功能就可以了。但是如果要有效地组织复杂的工程,提高代码的重用性,充分理解和合理的利用“基于组件”的对象
模型 设计思想还是很重要的。

分类: unity3d 标签:

Unity3D研究:如何更合理的架构你的游戏脚本

2015年1月22日 没有评论

这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难。这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友学会如何更好的写游戏脚本,当然本文这紧紧是我这么多年对游戏开发的认知,你也可以有你自己的看法。首先我们看看游戏主要是由哪几部分组成的,如下图所示,任何平台下的任何游戏核心都是由:数据、逻辑、渲染三大部分组成。

当你写过》=2个平台下的游戏时你会发现其实游戏开发很“容易”,为什么“容易”呢?因为此时你会发现所有平台下开发游戏的模式,如下图中的“数据”与“逻辑”两部分真的是完全一样的,这两部分是与游戏开发平台无关的。然而真正与游戏平台有关的紧紧是“渲染”这部分,因为各个游戏平台下的渲染接口是不同的。这也就印证了一点,能把J2ME游戏写好的程序员就必然能把IOS或Android游戏同样的写好。读到这里请结合一下你的公司情况,你可能会发现在你的技术总监两三天就能上手Unity3D游戏开发 Cocos2d游戏开发,这并不是他对游戏平台研究的透彻,而是他对游戏数据的掌控能力非常强,所以能很快玩转各个平台下的开发。

         如下图所示,Unity3D这套游戏引擎在游戏开发中的权重如图中所示。其中包含100%的渲染部分 +50%左右的逻辑部分。(因为Unity3D封装了很多与逻辑相关的API供开发者使用)

 

        下面我们回到Unity3D脚本架构的编写上,我们知道Unity3D在是可以创建游戏场景的,在每个游戏场景中又可以创建游戏对象,把每个场景的游戏对象融合在一起就是一款3D游戏。游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景之上的脚本,我称之为“全局脚本”。如下图所示,所有场景都能与这个唯一的全局脚本进行交互。举个例子,当场景切换时可将临时逻辑数据写入全局脚本中,切换完毕后再去全局脚本中取之前保存的数据,从而实现交互。(当然还有别的办法也能实现这个效果,但是我觉得这样做会更好一些,数据会更安全一些)

         接着我们就进入场景中,游戏场景是由若干游戏对象组成,下面我好好说一说游戏对象。游戏对象是需要绑定游戏脚本才能完成它的生命周期。那么脚本的使命就会尤其的重要。因为游戏对象比较多那么脚本必然会出现交互的情况,如下图所示,很多初期Unity3D的项目中的脚本会编写成这个样子。错综复杂相互交互,这样编写的脚本有可能你的游戏能做出来,可是你在维护的时候团队开发的时候你会发现你的脚本非常的混乱,别的同事想改都不知道怎么改。(显然这样的作法时完全错误的)

         我们想想为什么脚本之间要交互,原因很简单。是因为脚本中需要使用/调用另一条脚本或者另一条脚本对应的游戏对象某一项数据/方法,为了解决这个问题而导致最终的脚本非常混乱。为了避免这个问题,我在开发中会这么做,如下图所示,脚本之间切记不要做直接的相互交互,脚本之间只做间接的交互。每一个游戏场景都有一个凌驾所有游戏对象之上的单例脚本,在这条脚本中保存场景中所有脚本的公共数据。包括该场景的整体逻辑更新都是在这条单例脚本中完成。每条脚本都只与这个单例脚本做交互,和别的脚本一概不交互。(间接交互)

         编写脚本时请注意,脚本只干属于自己最重要的事情,就跟代码中的函数一样,只干最重要的事情。切记和该条脚本无关的事情不要去管,不要在脚本中做过多的相互连带工作,让所有连带工作的话都放在全局单例脚本中来做。

  这里我们举一个例子,主角砍怪或技能攻击怪,怪物受伤只到怪死亡以后屏幕播放一段胜利动画。

1.主角对象发动攻击,全局单例脚本接受按键事件后通知主角脚本播放攻击动画。

2.敌人对象接受到主角发送攻击消息时开始播放受伤动画,敌人脚本接收到主角的碰撞时询问单例脚本 主角是“普通攻击、还是技能攻击”,接着敌人播放对应的受伤动画,根据攻击类型敌人对象开始减血。

3.重复上面的操作,当敌人的血量《=0的时。敌人销毁自身对象,并且敌人脚本告诉单例脚本自己已经死亡。此时,单例脚本在调用“胜利动画”对象播放胜利动画效果。

上述逻辑我是完全按照刚刚图片中所说明的方式来写,这样做就可以很好的避免交互交互混乱的情况,其实开发中的所有类似这种交互的情况都能很好的用这个全局单例脚本来解决。希望广大Unity3D开发爱好者可以和我讨论,因为我知道架构设计没有最好只有更好。嚯嚯!!

这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难。这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友学会如何更好的写游戏脚本,当然本文这紧紧是我这么多年对游戏开发的认知,你也可以有你自己的看法。首先我们看看游戏主要是由哪几部分组成的,如下图所示,任何平台下的任何游戏核心都是由:数据、逻辑、渲染三大部分组成。

当你写过》=2个平台下的游戏时你会发现其实游戏开发很“容易”,为什么“容易”呢?因为此时你会发现所有平台下开发游戏的模式,如下图中的“数据”与“逻辑”两部分真的是完全一样的,这两部分是与游戏开发平台无关的。然而真正与游戏平台有关的紧紧是“渲染”这部分,因为各个游戏平台下的渲染接口是不同的。这也就印证了一点,能把J2ME游戏写好的程序员就必然能把IOS或Android游戏同样的写好。读到这里请结合一下你的公司情况,你可能会发现在你的技术总监两三天就能上手Unity3D游戏开发 Cocos2d游戏开发,这并不是他对游戏平台研究的透彻,而是他对游戏数据的掌控能力非常强,所以能很快玩转各个平台下的开发。

 

         如下图所示,Unity3D这套游戏引擎在游戏开发中的权重如图中所示。其中包含100%的渲染部分 +50%左右的逻辑部分。(因为Unity3D封装了很多与逻辑相关的API供开发者使用)

 

 

        下面我们回到Unity3D脚本架构的编写上,我们知道Unity3D在是可以创建游戏场景的,在每个游戏场景中又可以创建游戏对象,把每个场景的游戏对象融合在一起就是一款3D游戏。游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景之上的脚本,我称之为“全局脚本”。如下图所示,所有场景都能与这个唯一的全局脚本进行交互。举个例子,当场景切换时可将临时逻辑数据写入全局脚本中,切换完毕后再去全局脚本中取之前保存的数据,从而实现交互。(当然还有别的办法也能实现这个效果,但是我觉得这样做会更好一些,数据会更安全一些)

 

 

         接着我们就进入场景中,游戏场景是由若干游戏对象组成,下面我好好说一说游戏对象。游戏对象是需要绑定游戏脚本才能完成它的生命周期。那么脚本的使命就会尤其的重要。因为游戏对象比较多那么脚本必然会出现交互的情况,如下图所示,很多初期Unity3D的项目中的脚本会编写成这个样子。错综复杂相互交互,这样编写的脚本有可能你的游戏能做出来,可是你在维护的时候团队开发的时候你会发现你的脚本非常的混乱,别的同事想改都不知道怎么改。(显然这样的作法时完全错误的)

 

 

         我们想想为什么脚本之间要交互,原因很简单。是因为脚本中需要使用/调用另一条脚本或者另一条脚本对应的游戏对象某一项数据/方法,为了解决这个问题而导致最终的脚本非常混乱。为了避免这个问题,我在开发中会这么做,如下图所示,脚本之间切记不要做直接的相互交互,脚本之间只做间接的交互。每一个游戏场景都有一个凌驾所有游戏对象之上的单例脚本,在这条脚本中保存场景中所有脚本的公共数据。包括该场景的整体逻辑更新都是在这条单例脚本中完成。每条脚本都只与这个单例脚本做交互,和别的脚本一概不交互。(间接交互)

 

 

         编写脚本时请注意,脚本只干属于自己最重要的事情,就跟代码中的函数一样,只干最重要的事情。切记和该条脚本无关的事情不要去管,不要在脚本中做过多的相互连带工作,让所有连带工作的话都放在全局单例脚本中来做。

  这里我们举一个例子,主角砍怪或技能攻击怪,怪物受伤只到怪死亡以后屏幕播放一段胜利动画。

1.主角对象发动攻击,全局单例脚本接受按键事件后通知主角脚本播放攻击动画。

2.敌人对象接受到主角发送攻击消息时开始播放受伤动画,敌人脚本接收到主角的碰撞时询问单例脚本 主角是“普通攻击、还是技能攻击”,接着敌人播放对应的受伤动画,根据攻击类型敌人对象开始减血。

3.重复上面的操作,当敌人的血量《=0的时。敌人销毁自身对象,并且敌人脚本告诉单例脚本自己已经死亡。此时,单例脚本在调用“胜利动画”对象播放胜利动画效果。

上述逻辑我是完全按照刚刚图片中所说明的方式来写,这样做就可以很好的避免交互交互混乱的情况,其实开发中的所有类似这种交互的情况都能很好的用这个全局单例脚本来解决。希望广大Unity3D开发爱好者可以和我讨论,因为我知道架构设计没有最好只有更好。嚯嚯!!

分类: unity3d 标签:

Get and Post(Unity3D开发之六)

2014年8月4日 没有评论

unity3d中的www直接提供了web请求服务。使用也非常简单。

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

public class WebManager : MonoBehaviour {

	// Use this for initialization
	void Start () 
	{
		// Request by get
		StartCoroutine(Get("http://www.cocos2dev.com/"));

		// Request by post
		Dictionary<string, string> dic = new Dictionary<string, string> ();
		dic.Add("userId", "6001345679887");
		dic.Add("eventId", "10018");
		StartCoroutine(Post("http://192.168.1.102/api.php", dic));
	}
	
	// Update is called once per frame
	void Update () 
	{
	
	}

	// Post
	IEnumerator Post(string url, Dictionary<string, string>postData) 
	{
		WWWForm form = new WWWForm();
		foreach(KeyValuePair<string, string> postArg in postData) 
		{
			form.AddField(postArg.Key, postArg.Value);
		}
		
		WWW www = new WWW(url, form);
		yield return www;
		
		if (www.error != null) 
		{
			Debug.Log("error is :"+ www.error);
		} 
		else
		{
			Debug.Log("request result :" + www.text);
		}
	}
	
	// Get
	IEnumerator Get(string url) 
	{
		WWW www = new WWW (url);
		yield return www;
		
		if (www.error != null) 
		{
			Debug.Log("error is :"+ www.error);
		} 
		else 
		{
			Debug.Log("request result :" + www.text);
		}
	}
}
分类: unity3d 标签:

我的Unity之旅

2013年3月12日 没有评论

本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处。

http://blog.csdn.net/amazonzx/article/details/8662942

好久没有写blog了,为什么?因为这半年我加入了Unity。

 

Unity?是的,它是一个公司,不是Ubuntu的Unity,而是一个引擎公司,它创造了一个叫做Unity3D的游戏引擎。

 

至于为什么加入,这恐怕要从去年一月份开始说起了。

 

当时的我还在盛大,正值公司向轻量化进行转型,所以本来还在为公司自主研发3D游戏引擎的我开始使用了Unity,研究如何使用它在移动设备上进行大型3D游戏的研发。就这样,我开始接触到了Unity。

 

在一开始使用时,其实还是蛮不适应的。因为每天不需要再埋着头、敲着一行一行的C++代码,也不会再有坐在那里一动不动、调Bug调上几个小时,更不会出现即使使用N个核来编译代码,也要编译好几分钟才出结果的情况,取而代之的,反倒是在编辑器界面上拖拖拽拽,最多也就是写一写C#脚本,点一个“Run”就可以运行,甚至于还可以边运行边编辑,一边玩一边改。我突然觉得我不像个程序猿,反倒更像是个TA了,这点让我有点不爽,相信很多程序猿一开始都有这种感觉。不过另一方面,我心里也不得不说,WOW!Amazing!如果我自己没有参与过引擎的研发,我可能永远也不会明白想把一个引擎开发到如此程度是一个多么困难的事情,简单友好的操作界面、多平台发布、各种很棒的工具以及系统集成、脚本的自身编译等等,坦白说,很多功能甚至都是我想都不敢想的。如果我没有做过五年的Graphics学术研究,我可能永远不会明白,一个简单优化的操作界面对于3D图形工具来说是多么的重要。我记得曾经向一位图形学界的大牛问过这样一个问题,“图像学研究的意义是在哪里?”。我本以为他会说
“让真实感渲染变得更加逼真、高效”等诸如此类的话,但他的回答却是“让人们可以像使用Photoshop一样使用3D图形工具,图形学的研究应该注重在如何降低3D的门槛,让更多的人参与进来”。不得不说,在使用Unity的过程中,让我越来越明白了这话的意义。

 

在使用了Unity一个月后,发现Unity的强大并不仅仅在于表面。其本身对于脚本的code提供了各种各样的API,让我可以很方便地扩展游戏功能,甚至于还可以在编辑器中二次开发,写出各种适合自身项目以及方便美术、策划的插件。那一时间段的我对Unity可以说是很着迷,白天在公司做游戏,晚上回来就上网浏览各种各样的Unity教程、英文书、网站论坛等等。所以在接下来的几个月中,白天忙公司的,晚上在家忙自己的小游戏,后来打个包发到了Unity圣典论坛上,自此还结实了该论坛的创始人“hawk”。在此,不得不提一下Unity圣典这个论坛,让我非常感动的就是它的奉献精神,几乎将当时Unity所有的manual
document都翻译了一遍。我很喜欢这样的分享精神,所以也就跟“hawk”一起翻译起来,几个月下来,基本上翻译了二十多篇,虽然占用了不少时间,但自我感觉还是很有意义的,毕竟在国内还有相当一部分开发者,其英语的阅读能力还不过关,希望能够通过我们的翻译,来让他们更好地了解Unity这个工具。在翻译的同时,我也不知不觉地就当上圣典论坛的版主,那段时间每天晚上,我都会花上不少时间来解答和讨论论坛里面的各种问题,后来论坛里逐渐吸引来更多的有激情的Unity开发者(hog、江南、小妖等等),论坛的帖子在hawk的各种推动下与日俱增,从200,到400,再到700,最后居然蹦到过1000,呵呵,虽然现在帖子数量出现了不小的回落,但我还是认为圣典论坛依然是目前国内最火的Unity技术论坛,没有之一(在此,我要对hawk道个歉,因为十月份加入Unity后,工作实在太忙,以至于关注和搭理论坛的时间越来越少,很是抱歉!)。

 

接下来,随着使用的逐步加深,也越来越发现Unity还是有一些不尽人意的地方,自身的GUI系统、地形系统、本身的内存管理和版本管理等等。不过其实没有过不去的坎,就看你是不是“练到家”了。所以在接下来的几个月,研究了在Unity基础上如何做优化、如何有效地管理内存等等。之前网上一直在热议Unity的好坏,其实Unity只不过是一个制作游戏的工具而已,游戏做的不好怨工具,那是否程序猿写不好代码要赖C++、C、Java等语言呢?游戏做得最后,跟武功练到上乘一样,最后比拼的其实都是自身的内力。

 

再后来,就到了十月份,在Tec的推荐下,我有幸加入到了Unity。Unity China是一个很棒的团队,每个人都很strong和nice。团队很小,但能量很大。团队中每个人每天的工作量都很大,以至于这几个月下来由于经常不按时吃饭,把自己的胃搞坏了,让我二十多年来头一次在大年三十由于胃疼在床上躺了一天….(悲剧!)

 

接下来就是在Unity忙碌而充实的工作了。在Tec的带领下,我主要在技术团队中参与了以下三项工作。一是将Unity web player预装到360浏览器上,从而让大量的玩家可以在360浏览器上免安装插件,直接玩Unity的web game;二是完成了Unity web player在ChinaCache上部署,从而让国内的玩家可以不用大老远地从国外的服务器上下载和更新插件,进而提升插件的更新效率,现在每天都有大量的用户通过ChinaCache来更新插件,自己看着很是欣慰;三是解答来自国内开发者的各种Unity相关问题,这个我还是蛮擅长的,可以说,之前的游戏开发经验、文档翻译以及圣典论坛的帮忙,让我对于Unity已经有了很深入的了解。同时,我也喜欢研究一些有意思的问题,并将自己积累的经验分享出去,以期能够帮到更多的开发者。国内技术方面的交流和分享一直以来都很闭塞、很匮乏,我在读书时就深有感触,所以一直希望能够做点什么来改变它,现在终于有了这样一个机会,呵呵。

 

我个人很喜欢Unity的理念:让人人都能做出自己心中的游戏。虽然就目前来看,这个目标还是相当的高,但它已经体现出了“以人为本”的概念。在我看来,一个引擎优秀与否不应该仅仅看它的功能是否强大,更应该看它是否可以让开发者更快地上手、更高效地完成他们的游戏。想客户所想、解决客户所需,这才是一个先进工具应该有的姿态。无论是技术讲座、还是通过邮件的技术支持,我们都希望可以真真切切地帮到国内的游戏开发者。我的理念是,希望通过不断的努力,可以让中国的游戏界变得稍稍有那么一点不一样!

分类: unity3d 标签:

Unity3D+免费工具开发2D游戏之四:创建计分界面

2012年8月15日 没有评论

本篇文章中,我们将创建一个可以被捡起的物体,并完成计分系统,然后再添加一个文本界面,用来显示分数、生命和关卡。

 

点击这里查看本节完成后的效果:点我!

 

添加计分和拾取物脚本

 

到目前为止,咱们的游戏还不错啊——主角可以移动、爬梯子以及沿着绳子攀岩。现在我们来添加拾取物“金库”和一个界面,这个界面记录着分数、主角生命和当前的关卡级别。

 

  1. Download
    scoring and pickup scripts
    ,下载后解压。
  2.  Scoring.cs 和 Pickup.cs 拷贝到项目的Assets/Scripts目录下。

 

对脚本进行修改

 

  • 打开 xa.cs,取消注释掉下面一行:
public static Scoring sc;

 

  • 在Start函数里,取消注释下面一行:
sc = (Scoring)(this.gameObject.GetComponent("Scoring"));

 

  • 打开Player.cs,找到OnTriggerEnter function函数(256行),然后取消注释下面一段代码:
if (other.gameObject.CompareTag("Pickup"))
{
    if (other.GetComponent<Pickup>())
    {
        other.GetComponent<Pickup>().PickMeUp();
        xa.sc.Pickup();
    }
}

制作拾取物精灵

  • 将Orthello –> Objects –> Sprites下的Sprite拖放到Hierarchy 或Scene中,重命名为“pickup”。
  • OT –> Containers下的level对象拖放到Sprite Container中。
  •  “Frame
    Index
    改为16.
  • 将Scale里的x、y改为1。

 

调整下碰撞

  • 这个精灵是个正方形,但是我们只希望只有当玩家碰到它的白色部分才能捡起它。
  • 勾选Collidable ,给精灵添加碰撞检测。
  • 点击Physics 旁的下拉菜单,选择Custom。
  • Box Collider下面,将Center
    Y改为
    -0.15Size
    X
    改为0.8Size
    Y
     改为0.5.
    保留
    Size Z 为 0.4。

设置标签

  • 我们需要标记拾取物,这样当玩家碰到它时才会触发它碰撞。
  • 通过 Edit
    –> Project Settings –> Tags
    创建一个新的Tag
  • 将新Tag命名为Pickup” 
  • 点选pickup对象,在Tags旁的下拉菜单里选择“Pickup”


添加脚本,并将其改为Prefab

  • Pickup.cs脚本拖放到pickup对象上
  • 将pickup对象拖放到Prefabs文件夹中

根据前面几节学的知识,将pickup对象放到砖地上吧。如果你根据我的步骤做的,你应该看到下图结果:

Unity3D+免费工具开发2D游戏之四:创建计分界面

 

添加界面上的文字

待续。。。

 

 

 

 

 

 

 

 

 

分类: unity3d 标签:

关于unity3d碰撞的一些东西

2012年8月2日 没有评论

转自:http://www.cnblogs.com/oldman/articles/2396074.html


具体的一些,可以看 unity3d的 manual refrernce的东西,有几个表格在后面可以参考:

几个类型碰撞器:
1. 静态碰撞器: 就是只有碰撞器,但没有刚体的
2.刚体碰撞器: 带Rigidbody的碰撞器,这个是最基本的碰撞器
3.运动学刚体碰撞器: 带Rigidbody, 而且Rigidbody的IsKinematic打勾的,注意这个碰撞器是不能加力的,只能修改他的transform才能移动

Triggers 触发器

仅需要选中Inspector中的IsTrigger属性选择框。触发器不受物理引擎控制,当和一个触发器发生碰撞时会发出三个独特的触发信息,为了使两个触发器碰撞时发出碰撞事件,其中一个必须包含刚体.


今天遇到的一个情况是:如果刚体碰撞器不动,静态碰撞器去碰撞,则不会触发任何信息,而如果静态碰撞器不动,刚体碰撞器(包括运动学刚体碰撞器)去碰撞静态碰撞器,则会触发碰撞,如果是触发器,则会触发事件。所以下面的表格提供了触发的条件,但主动性大家也还需要注意,不然要纠结一段时间的。





Collision detection occurs and messages are sent upon collision

碰撞后有碰撞检测并有碰撞信息发出
  Static Collider

静态碰撞器
Rigidbody Collider

刚体碰撞器
Kinematic 

Rigidbody Collider

运动学刚体碰撞器
Static 

Trigger Collider

静态触发碰撞器
Rigidbody 

Trigger Collider

刚体触发碰撞器
Kinematic Rigidbody 

Trigger Collider

运动学刚体触发碰撞器
Static Collider 静态碰撞器   Y        
Rigidbody Collider 刚体碰撞器 Y Y Y      
Kinematic Rigidbody Collider 

运动学刚体碰撞器
  Y        
Static Trigger Collider

静态触发碰撞器
           
Rigidbody Trigger Collider

刚体触发碰撞器
           
Kinematic Rigidbody Trigger Collider

运动学刚体触发碰撞器
           
Trigger messages are sent upon collision

碰撞后有触发信息
  Static Collider

静态碰撞器
Rigidbody Collider

刚体碰撞器
Kinematic 

Rigidbody Collider

运动学刚体碰撞器
Static 

Trigger Collider

静态触发碰撞器
Rigidbody 

Trigger Collider

刚体触发碰撞器
Kinematic Rigidbody 

Trigger Collider

运动学刚体触发碰撞器
Static Collider 静态碰撞器         Y Y
Rigidbody Collider 刚体碰撞器       Y Y Y
Kinematic Rigidbody Collider

运动学刚体碰撞器
      Y Y Y
Static Trigger Collider 静态触发碰撞器   Y Y   Y Y
Rigidbody Trigger Collider

刚体触发碰撞器
Y Y Y Y Y Y
Kinematic Rigidbody Trigger Collider

运动学刚体触发碰撞器
Y Y Y Y Y Y
分类: unity3d 标签: