unity3d 仿制手游感受

虽然这一年多一直在做unity3d相关的周边内容,但基本上我不参与项
目的具体细节内容。所以对于unity3d在项目工作量上的估计一直不是非常
的清楚。最近三天模拟了一款手游,2D界面,不用3D是由于3D的素材太难
找了,各种动作什么的,不过,unity3d 的mecanim系统实在用着实在太好
了,在这次的实践中也想采用类似的设计机制。

从上周五决定到现在,服务器+客户端+切图片,总共用了3天时间,大
约模拟了系统中的6个左右的界面,大界面的话包含3个,服务器完成了两
个系统,只所以把切图专门算出来是由于我手边没有完整的合适的游戏素
材,就直接从被仿制的手游的资源包里拿出来了,在那个包里,很多素材
都是拼在一张图中,只能一个一个手动切出来了,结果这一切就切出了上
千张的小图片,而且,还有大堆的图片素材还等着切。

切的实在烦了,就想着先总结下吧,反正框架放在那儿,就剩下添肉了。

感受: 使用unity3d让我想起了最初使用flash 3还是flash4的时候的
感觉,设计界面,添加响应,处理流程等等,觉得很顺手,唯一不顺手的
就是记不住快捷键。

结构: 基本上沿用老一套的手机游戏的设计模式,一个总管,动态加
载,动态删除,没办法,手机程序设计习惯了,又要小内存,又要速度快,
还要结构简单,随时可以拼拼凑凑的积木模式。

时间: 总的而言,使用unity3d设计的话,项目进行的速度会非常快,
而根据程序的架构,也可以非常适合多人合作的开发,如果多人合作的话,
就会更快了,就我的实际仿制内容而言,如果不计算美工时间的话,我一
个人进行服务器+客户端的开发,大约两个月就可以基本完成了,不过,目
前的切图量太大了,如果是真实项目的话,那就不用切图,直接拿来使用,
不用一张图一张图的查找,速度会快上不少。

目前进行的进展: 服务器完成数据库规划,人物角色,系统公告,消
息发布,部分道具,前前后后大约用了4个多小时,主要是对游戏的细节内
容不熟悉,经常弄着弄着就在游戏中发现了一个新的属性要往数据库中写,
或者自己认为的是错误的,然后就重新生成下,不过,使用erlang设计服
务器就有一点好,不用重启服务器,直接修改,编译,自动热加载,然后
数据就是新的,客户端的网络都不用断开(我用的是socket联网)。客户
端完成了登录,主界面,角色界面,成员列表界面,招募界面等等还有一
些其他的零碎的,这里面也包括网络交互和逻辑设计,大约用了一天半,
由于是仿制的,资源什么的切图都是按照1,2,3,4,这样的随意排的,每次
要使用一个资源总要查找不少时间,有些时候觉得还是在windows的浏览器
中比较方便。剩下的一天时间基本都是切图时间,自我感觉甚至切图的时
间比这个还要多,切了将近800多张图,
简直累死人了,我觉得我对gimp的那几个快捷键都要按的要吐了。

收获: 怎么说呢,使用unity3d设计就像使用C++ Builder设计windows
程序一样,我比较喜欢使用C++ Builder设计windows程序,也喜欢这种设
计理念,直接先快速搭建框架界面,这样可以快速的知道项目需要多少内
容,而且,也方便内容分工,对于工作内容而言,可以将注意力集中在某
一块,化整为零,一个一个的解决。不过,令我不满意的是,unity3d的编
辑客户端怎么不支持linux啊,怎么不支持命令行脚本控制啊!这个不符合
我的风格啊
%@#¥#@¥@&^

unity3d 中的一个误区

首先,我不知道这是unity3d的设计还是一个失误,我对unity3d并没有
达到精通的地步,所以,只能以自己认识上的一个失误来做标题。

其次,我对C#也没有像C/C++那样精通,因此,对于这个问题是unity3d
本身引起的还是C#引起的也不清楚。

首先,看下面的代码:

       using UnityEngine;
using System.Collections;

public class Right_Ctrl : MonoBehaviour {
	public GameObject[] small_ctrl;
	
	// Use this for initialization
	void Start () {
		float x = 0.2;
        float y = 0.2;
		for (int i = 0; i < small_ctrl.Length; i++) {
			 Instantiate(small_ctrl[i], new Vector3((x + i * 0.1,
													y,
													0.0f),
										  Quaternion.identity);
		}
		
	}
	
	// Update is called once per frame
	void Update () {
	
	}
	
	void OnGUI()
	{
	}
}

       

代码大致如此。每一个small_ctrl都是从Prefab中拖入的,场景中并不
存在。每一个small_ctrl的Prefab都添加了mobile中的Joystick插件,因
此,可以作为单独的按钮(设置了Touch Pad属性)来使用。

但上述的代码在监测clone出来的按钮的时候出现了麻烦,表现是无论
如何都没办法监测到按钮状态的变化。

修改的方式有两种:

第一种是比较笨的方法,就是在场景中添加每一个small_ctrl,然后修
改循环中的代码为如下的方式:

       small_ctrl[i].transform.position = new Vector3(x + i * 0.1,
													y,
													0.0f);
       

这种方式规矩很死,直接被我放弃了。因为我要的是动态的内容,每个
small_ctrl都必须是独立的,最后形成组积木的方式。于是,就有了第二
种方式:

       small_ctrl[i] = Instantiate(small_ctrl[i], new Vector3((x + i * 0.1,
													y,
													0.0f),
										  Quaternion.identity);
       

代码是有一点点变化的!!!,每一个small_ctrl由prefab clone出来
后,再覆盖掉自己所在位置的元素。如果没有那个赋值的话,就会存在问
题,如果有的话,就不会有问题了。

本来以为有问题的,写到这里突然想明白了,是自己的一个失误,为了防止再
次产生,还是接着记录下去,接着看我使用的代码:

       Right_Ctrl r = right_Ctrl.GetComponent();
		for (int i = 0; i < r.small_ctrl.Length; i++) {
			Joystick joy = r.small_ctrl[i].GetComponent();
			
			if (joy.isFingerDown) {
            //do something....
			}
		}
       

如果没有那个赋值操作的话,每个数组的元素都还是prefab,因此上述
代码没办法监测按钮按下,就像没有实例化一样。

同理,如果有赋值的话,每个数组的元素都将被替换为具体的实例,因
此可以监测到。

突然想到,如果使用Message的方式的话,也可以在不赋值的情况下做
正确的事情,类似的还有比如另外的具体操作的类什么的,也可以实现。
想来想去,自己钻到牛角尖了。

最后,浪费了各位看官的感情,以后分析问题还是老实些比较好,今天
太急躁了。