存档

2010年12月16日 的存档

我们应该改变Linux的24件事

2010年12月16日 没有评论

如果你使用Linux的时间很长,那你一定会有一些想法深藏在心底,我和你一样,用惯了Linux,就希望它变得更完美,下面是我整理的希望Linux改变的24件事。

  1、一劳永逸地修复声音系统问题

什么ESD,aRts,OSS和ALSA都是过去式了,现在用的最广泛的声音系统解决方案当属PulseAudio,但它也并非完美的 Linux声音系统解决方案,一样有很多人每天被它折腾,因此创建一个新的声音系统解决方案,一劳永逸地解决Linux声音系统问题是我最想说出来的一件 事。

 2、不再内讧,不再相互诋毁

如果你在使用一个其他人不喜欢的Linux发行版,他们可能会对你进行人生攻击,LXF Towers现在收到来自Ubuntu仇敌的读者来信是最多的。大家都知道,Ubuntu只是在Gnome和KDE上再加了一层装饰而已,我不知道为什么 会有这么多人如此愤怒,停止内讧,Linux不应该搞种族歧视,让所有发行版和谐共处。

3、增强显卡支持

你还记得上个世纪90年代安装Linux的痛苦经历吗,辛辛苦苦安装后却进不了图形桌面,面对冰冷的命令行窗口,你不知道该输入点什么,虽然 现 在情况有所改观,但众所周知,Linux下显卡驱动一直未得到很好的解决,仅有部分厂商提供Linux显卡驱动,更多的时候我们需要借助于开源驱动,总 之,提到安装显卡驱动就让无数人头痛。

4、简化软件包管理

我知道有选择是好的,但软件包管理如果能更简便就更好了,在Linux下安装一个程序对新手来说还是有点挑战,rpm,deb和源代码软件包格式也应该统一,不能再搞分裂。

 5、向后兼容

如果你在使用glibc 2.11.1,由于某种原因你要升级到2.11.2,不应该破坏已安装的程序,微软在这方面做得很好,即便是Windows 95下使用DirectX 1.0预览版的程序,也仍然可以在Windows 7 DirectX 11环境下运行,虽然不一定非要做到那种境界,但至少让相邻几个版本保持兼容很重要,相信你一定经历过升级软件后就不能使用的尴尬。

 6、兼容Mac游戏

Wine让Linux用户可以运行Windows程序,这是一个伟大的项目,另一方面,Mac OS X也开始使用开放的API,如OpenGL和OpenAL,因此建议开发人员多付出一点努力,将Mac平台上大量的好游戏也移植到Linux上来吧。

 7、为废纸篓统一名称

不管你信不信,如果你使用英国英语,桌面使用Gnome,那你可能看到过回收站,垃圾桶,废纸篓等各式名称,虽然这个不影响使用,但统一一下名称似乎也不难吧。

 8、简化驱动安装

我不知道你是怎么安装Linux驱动的,有时安装驱动还需要升级内核,这会让许多用户彻底抛弃Linux,戴尔的动态内核模块支持(Dynamic Kernel Module Support,DKMS)已经修复了这个问题,希望能大力推广。

9、保证能从休眠状态醒过来

这个完全凭运气,上周我曾冒险尝试了一下,我似乎有点倒霉,不知你是否经常遇到休眠后不能再醒过来的情况,好的时候只需要重启一下,更糟糕的情况则可能需要重设BIOS。

10、移除Grub

如果你用过双启动Mac,你一定会被它那聪明,易于使用的操作系统选择屏幕折服,你不禁要问:“Grub为什么就长这么丑呢?”,当你启动系 统 时,你可能发现有8个不同的Linux启动选项,其中4个是过去几个月升级内核留下的,加上每个内核版本对应的安全恢复启动选项,当你看到这样的Grub 启动屏幕时,是不是有种想砸掉电脑的冲动呢?

11、让每个任务都可从GUI执行

如果你常常出入各种Linux问答社区,你一定经常看到“打开终端窗口,输入….”这种回答,是的,没错,我们为什么就不能直接从图形界面完成这些操作呢?

 12、滚动发布
如果有人想使用最新的Gnome,难道就只有等上6个月,等待发行版的新版本吗?当然不应该等待那么长时间,Arch Linux早已意识到这一点,它采用了滚动发布,希望其它发行版也借鉴一下。
13、大修KDE桌面
KDE曾经是Linux桌面的霸主,但现在层出不穷的桌面让我们眼花缭乱,KDE不失为经典桌面,虽然现在正被以Gnome为头的其它桌面挤压,但仍然有不少KDE粉丝,因此应重振KDE当年雄风。

14、改进文档

Man手册页面是不错的参考资料,但作为参考资料,它包含的例子还很少,更多的时候,它仅仅是将不相干的选项组合在一起,许多人阅读man手册页面时都有种意犹未尽的感觉,如果有人想创建一个项目致力于man手册页面的完善,请通知我一声。

15、更换掉Gimp

虽然Photoshop尚没有推出Linux版,但我们也应该立即停止使用Gimp,它的确是一款“伟大”的UI设计丑陋的软件,我想很难再找到界面比Gimp丑的Linux软件了。

16、更换掉OpenOffice.org

也许有人看到这里说我是不是疯了,先是要换掉Gimp,现在连OpenOffice.org也要一并换掉,我想说的是,这次的原因不是UI, 而 是速度,你不得不承认它是个吃资源的怪物,有时我在想OpenOffice.org成功的唯一原因可能是Linux用户别无选择。

17、文件系统布局是时候改改了

我不得不说,一层不变的类Unix文件系统布局有点古老,有点落后了,亲自动手安装过程序的人就知道,一个程序安装后会分散到系统多个目录 下, 应用程序应该是独立的,如RISC OS,Mac OS X和其它许多桌面操作系统一样,Gobo Linux在这方面做出了榜样。

 18、统一的外貌

简单就是美,我认为我们应该拥有一个统一的桌面,就好像Windows和Mac OS X那样,Gnome,KDE和其它桌面不应该相互排斥,应该走向统一,让所有Linux桌面都拥有一个统一的外观。

19、减少屏幕干扰

当Ubuntu连接到Wi-Fi网络时,会在屏幕右上角弹出一个小窗口告诉我们它已成功地连接到Wi-Fi网络,当我插入U盘,它会自动打开一个新的Nautilus窗口显示U盘中的内容,你能让我决定一下我怎么使用电脑吗?

20、更好地组织设置界面

KDE不断增长的控制中心显得越来越混乱,即便如此,我也觉得比Gnome怪异的分组要好,如果你不熟悉,你不得不来回在分组之间切换,如果找不到需要的设置选项,就只有直接在GConf中调整了。

21、干掉分散的点文件

点文件以点作为文件名的第一个字符,在Linux下,这种文件默认是隐藏的,许多程序的设置也喜欢使用点文件来保存,造成备份设置变得很困 难, 建议要么使用类似于Windows的注册表(使用GConf来启动),要么将它们集中到一个Settings目录中,方便管理和维护。

22、简化闭源软件的安装

我个人不喜欢使用闭源软件,如Nvidia驱动,Flash或MP3解码器,但我知道许多人会安装它们,有相当一部分人想安装这些闭源软件,但却苦于找不到安装方法。

如果能在系统第一次启动时告知用户“注意:默认情况下你无法播放DVD,Flash或听MP3,因为这些涉及到知识产权问题”,然后提供一个按钮一次性解决所有这些问题,虽然这对我来说用处不大,但对全世界那么多Linux用户,肯定是一种福音。

23、规范sudo的使用

根权限对Linux系统来说非常重要,不应该被随意使用,有些发行版使用sudo来提升权限,有些发行版使用su,还有一些发行版两者皆可用,不管怎样,规范su或sudo的使用很必要,简单说就是该用则用,不该用时就不能用。

24、不再开放核心

简单地说,开放核心意味着软件基本上就是开源的,越来越多的企业借助开源软件开发自己的闭源软件,MySQL就是一个例子,它有一个开放的数据库核心,但如果你想使用企业级功能,那你就得掏钱,这种利用开源社区的贡献赚自己钱的行为不知道该谴责还是鼓励。

分类: 编程技术 标签:

Unity脚本入门(2)

2010年12月16日 没有评论

前面我们提到,可以通过写代码的方式指定变量(而不是通过Unity界面),如何做到呢?上面按下空格时告诉聚光灯聚焦到Cube上,我们是在SpotLight脚本中做一个显式的变量,将Cube拖放上去.而在代码中主要有2种方法去实现:
1.使用对象的名称(name)
2.使用对象的标签(tag)

1.对象名称
可以从Hierarchy面板上看到对象的名称.用GameObject.Find()函数来使这些名称作为参数.因此,我们可以这样写:
function Update(){
if(Input.GetButtonDown(“Jump”))
{
var newTarget = GameObject.Find(“Cube”).transform;
GetComponent(SpotLight).target = newTarget;
}
}
注意,以上没有出现显式的变量.
2.对象标签
对象标签是一个字符串,用来识别一个组件.在Inspector面板中点击Tag按钮查看内建的标签.我们也可以创建自己的标签.GameObject.FindWithTag()函数能通过具体的标签寻找组件并返回一个字符串作为参数.
function Update(){
if(Input.GetButtonDown(“Jump”))
{
var newTarget = GameObject.FindWithTag(“fang”).transform;
GetComponent(SpotLight).target = newTarget;
}
}
7.实例
我们要在运行时创建(create)对象就要用到Instantiate函数.让我们来实现如何在每次按下开火按钮(鼠标左键或Ctrl键)后通过实例化一个新的对象.需要思考以下几点:
1.哪个物体做我们的实例?
2.在哪儿实例化?
关于第一个问题,最好的办法就是显式变量.这样我们就可以随时通过拖放来改变我们的实例对象.至于在哪儿实例化,我们只要实现当按下开火键时,在用户的当前位置创建一个对象即可.实例化函数有3个参数:1.我们要建立的对象.2.对象的位置坐标.3.对象的旋转位置.完整的代码如下:
var newObject : Transform;
function Update(){
if(Input.GetButtonDown(“Fire1”)){
Instantiate(newObject, transform.position, transform.rotation);
}
}
要记住,transform.position和transform.rotation是附加这个脚本的物体的位置.我们这里假设为主相机.一般情况下,将要被实例化的对象设置为预设(prefab),我们现将Cube设置为预设.
-首先,让我们创建一个预置.Assets->Create->Prefab.命名为Cube.
-从Hierarchy面板中选取Cube拖放到Project面板的Cube上.
-创建一个脚本并命名为Create,并把上面的代码加进去.
-把这个脚本赋予相机,并将Cube预设赋予脚本变量.
-运行.移动相机并按下开火键,你能看到新的Cube出现.
8.调试
调试是发现和修正你的代码中人为错误的技巧,Unity中提供了Debug类,我们现在看看Debug.Log()函数.
Log()函数允许用户发送信息到Unity的控制台.这样做的原因可能包括:
1.在运行时要验证某部分代码是否达成.
2.报告变量的状态.
我们现在使用Log()函数,当用户点击开火按钮时,发送一个消息到Unity控制台.
-打开创建的脚本并在”Instantiate”代码内”if”处添加如下代码:
Debug.Log(“Cube created”);
-运行.点击开火键,我们能看到Unity界面下方显式”Cube created”.
Watch
另外一个有用的功能是用于调试私有变量.这使得当Debug模式被选中时Inspector面板中的变量,但它不能被编辑.为了证明这一点,我们将显式一个私有变量作为Cube实例的计数器.我们在脚本中加入两行内容,1.添加私有变量cubeCount.2.当一个cube实例创建后增加这个变量
完整代码如下:
var newObject : Transform;
private var cubeCount = 0;
function Update(){
if(Input.GetButtonDown(“Fire1”))
{
Instantiate(newObject, transform.position, transform.rotation);
Debug.Log(“Cube created”);
cubeCount++;
Debug.Log(cubeCount);
}
}
9.常见脚本类型
每当一个新脚本被创建,默认情况下将包含Update()函数.这里我们讲解几个其他常见的函数.
FixedUpdate()
在这个函数体中的代码每隔固定的间隔执行.它通常在Rigibody中有力的作用的时候被用到.如:
// Apply a upwards force to the rigibody every frame
function FixedUpdate(){
rigidbody.AddForce(Vector3.up);
}
Awake()
这里的代码将被用作初始化.
Start()
这个函数在Update()之前,但在Awake()之后执行.Start()函数和Awake()函数的不同点在于Start()函数仅在脚本启用时候执行(Inspector面板中的复选框被选中).
OnCollisionEnter()
当游戏对象的碰撞脚本与另一个游戏对象碰撞时执行这个函数内的代码.
OnMouseDown()
当鼠标在一个载有GUI元素(GUIElement)或碰撞器(Collider)的游戏对象里按下时执行该函数体内的代码.
// Loads the level named “SomeLevel” as a response
// to the user clicking on the object
function OnMouseDown(){
Application.LoadLevel(“SomeLevel”);
}
OnMouseOver()
当鼠标悬停在一个GUI元素或碰撞器的对象上时,执行该函数体内的代码.如:
// Fades the red component of the material to zero
// while the mouse is over the mesh
function OnMouseOver(){
renderer.material.color.r -= 0.1 * Time.deltaTime;
}

分类: 游戏开发 标签:

Unity脚本入门(1)

2010年12月16日 没有评论

在Unity中脚本是必不可少的.因为他将定义你游戏的各种行为.这个教程将介绍javaScript的基本使用.
1.目标
在Unity中,脚本是用来界定用户在游戏中的行为(或规则).Unity推荐使用的编程语言是JavaScript,同时也支持C#或Boo.
2.前提
本教程的重点是Unity脚本基础,前提是你已经熟悉了Unity的界面(如果不是,你可以阅读UnityGUI教程).为了使脚本更容易理解,最好有个支持JavaScript语法高亮的代码编辑器,它会将关键字用醒目的方式显示出来.可以使用SubEthaEdit编辑器.
3.命名规范
开始前,先说下Unity的一些规范.
变量 – 首写为小写字母.变量用来存储游戏状态中的任何信息.
函数 – 首写为大写字母.函数是一个代码块,在需要的时候可以被重复调用.
类 – 首写为大写字母.可以被认为是函数的库.
当阅读范例时注意首写字母,将有助于你更好的理解对象之间的关系.
4.用户输入
我们第一个例子是在场景中实现一个简单的移动.
设置场景
-启动Unity.创建一个用来移动的平面.GameObject->CreateOther->Plane.在Inspector面板中设置Position为”0,0,0″.
-创建一个Cube.GameObject->CreateOther->Cube.坐标为”0,1,0″.
-我们都知道现实世界里物体成像靠的是光反射,那么我们这里也是需要光线的.GameObject->CreateOther->PointLight.坐标为”0,5,0″.
-保存.快捷键为Ctrl+s.
我们的第一个脚本
我们打算移动用户的视线,这需要通过控制主相机的位置来实现.我们就要写一个脚本,然后把脚本和相机结合起来.
-创建一个空脚本.Assets->Create->JavaScript并命名为”Move”.重命名快捷键为F2.
-双击打开脚本Move.默认包含Update()函数.将我们的代码加入这个函数,他将在每一帧执行一次.
我们需要用transform来改变相机的位置,用到Translate这个函数,他有x,y,z三个参数.我们加入以下代码:
function Update(){
transform.Translate(Input.GetAxis(“Horizontal”),0,Input.GetAxis(“Vertical”));
}
Input.GetAxis()函数返回一个从-1到1之间的值,如横轴上左半轴为-1到0,右半轴为0到1.如果需要,我们可以通过Edit->ProjectSettings->Input中重定义按键映射.
连接脚本
脚本写完了,如何让他起作用呢?我们需要把脚本赋予物体才行.
-点击希望应用脚本的物体对象.这里对我们而言就是相机.从Hierarchy面板中选中它.
-在菜单中选择Components->Scripts->Move,这样我们便从Inspector面板中看到相机中添加了Move这个组件.(我们也可以用鼠标把脚本拖拽到物体对象上)
点击运行,我们即可前后左右来控制相机移动了.
DeltaTime
放在Update()函数中的代码是按照帧来执行的.如果我们需要物体的移动按照时间秒来执行.为了实现这一目标,我们需要将Input.GetAxis()函数的返回值乘以Time.deltaTime:
var speed = 5;
function Update(){
var x = Input.GetAxis(“Horizontal”) * Time.deltaTime * speed;
var y = Input.GetAxis(“Vertical”) * Time.deltaTime * speed;
transform.Translate(x, 0, z);
}
这里的speed为显式变量,可以在Inspector面板中看到.我们可以在使用中随时调整它的值,很方便.
5.连接变量
Unity允许在界面上拖拽(drag and drop)的方式赋脚本.快捷方便.这里,我们将涉及连接变量的概念.
-在场景中添加一个聚光灯.GameObject->CreateOther->SpotLight.Position为”0,5,0″,Rotation为”90,0,0″.
-创建一个JavaScript脚本,命名为”SpotLight”.
我们想让聚光灯照向主相机.我们可以使用transform.LookAt()这个函数.
如何使用这个函数呢?我们需要创建一个显式变量.在SporLight脚本中写入如下代码:
var target : Transform;
function Update(){
transform.LookAt(target);
}
-把脚本赋予聚光灯对象.记得怎样赋予吗?要么在菜单栏Component中添加,要么鼠标拖放.之后,”target”变量就出现在Inspector面板里了.
-将Hierarchy面板中的主相机对象拖放到Target变量上.如果我们想让聚光灯照向其他物体,我们也可以将其他物体拖放上去,只要是Transform类型的即可.
-运行.你可以看到聚光灯一直照向主相机.
6.访问组件
一个游戏对象可能有多个脚本或其他组件.它将不可避免的要访问其他组件的函数或变量.Unity中通过GetComponent()函数来实现这个目的.我们现在要实现按下空格键后让聚光灯照向Cube.
我们考虑一下这个步骤:1.监视空格键被按下.2.空格键按下后聚光灯照向Cube.由于SporLight脚本中有target变量,我们只需要为这个变量设定新的值就可以了.
-创建一个脚本,命名为Switch,添加如下代码:
var switchToTarget : Transform;
function Update(){
if(Input.GetButtonDown(“Jump”))
GetComponent(SpotLight).target = switchToTarget;
}
注意GetComponent()的参数,它将返回一个参数给SpotLight脚本,我们就可以用它来访问”target”变量.
-添加Switch脚本到聚光灯对象,并将Cube拖放到Inspector面板中的switchToTarge变量上.
-运行.按下空格后,聚光灯将照向Cube.

分类: 游戏开发 标签: