存档

2010年12月 的存档

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.

分类: 游戏开发 标签:

关于贴图动画的一些经验

2010年12月15日 没有评论

原文:
uthor: Joachim Ante – Extended by TomLong74

1 Description
2 Usage
3 Example
4 JavaScript – AnimatedTextureExtendedUV.js
[edit] Description

This script extends the capabilities of the original AnimatedTexureUV.js. This allows many animation skins or animation states to be stored in the same texture. They can be updated at run time to play the new skin or new animation state via SetSpriteAnimation();
[edit] Usage

Attach this script to the object that has a material with the animation cell-sheet texture. From your other script call this script’s SetSpriteAnimation() function with the new parameters:
colCount: the total number of columns in the animation cell-sheet;
rowCount: the total number of rows in the animation cell-sheet;
rowNumber: the row where this animation will start;
colNumber: the column where this animation will start;
totalCells: the number of cells in this animation;
fps: the number of cells (frames) per second the animation will play;
[edit] Example


Example function call: SetSpriteAnimation(4,4,1,0,4,12); Should animate the 4 green cells starting with the left most cell and at a speed of 12 cells per second.
[edit] JavaScript – AnimatedTextureExtendedUV.js

//vars for the whole sheet
var colCount : int = 4;
var rowCount : int = 4;

//vars for animation
var rowNumber : int = 0; //Zero Indexed
var colNumber : int = 0; //Zero Indexed
var totalCells : int = 4;
var fps : int = 10;
var offset : Vector2; //Maybe this should be a private var

//Update
function Update () { SetSpriteAnimation(colCount,rowCount,rowNumber,colNumber,totalCells,fps); }

//SetSpriteAnimation
function SetSpriteAnimation(colCount : int,rowCount : int,rowNumber : int,colNumber : int,totalCells : int,fps : int){

// Calculate index
var index : int = Time.time * fps;
// Repeat when exhausting all cells
index = index % totalCells;

// Size of every cell
var size = Vector2 (1.0 / colCount, 1.0 / rowCount);

// split into horizontal and vertical index
var uIndex = index % colCount;
var vIndex = index / colCount;

// build offset
// v coordinate is the bottom of the image in opengl so we need to invert.
offset = Vector2 ((uIndex+colNumber) * size.x, (1.0 – size.y) – (vIndex+rowNumber) * size.y);

renderer.material.SetTextureOffset (“_MainTex”, offset);
renderer.material.SetTextureScale (“_MainTex”, size);
}
中文的已经有人翻译出来了,大体意思是多。我在使用的过程中的经验:
1,添加cube到场景中;
2,添加材料到cube上;
3,将cube的shader设置为Tranparent/diffuse;
4,将贴图拉到cube上;
5,将贴图的Tiling的x,改成1/frame,frame表示,小贴图的个数;
6,脚本等,就不说了,就是有一个问题,发现,调用脚本动画时候,Time.time已经运转,那么就不是从第一帧开始执行了,我的解决方案是在Start()中获取一个起始时间,然后在脚本动画函数中,减去这个时间。
7,现在发现的问题是,贴图和cube的契合度,会出现,画质损失,或者,在最上面出现最下面的一些像素点。

分类: 游戏开发 标签:

unity圣典

2010年12月15日 没有评论

推荐一个unity手册汉化的网站:unity圣典
有很多志愿者一起翻译官方文档。这样会比较正规,比较有错误,可以被揪出。

分类: 游戏开发 标签:

那时的爱情

2010年12月11日 1 条评论

夜深了,现在已经习惯了晚睡。不过是在埋头写代码,而不是埋头,思如泉涌。常常提笔也不知道写什么,即便有些感悟,也要被我扼杀,因为他们将困扰我。
人的心境,是一步一步过来,过来的时候,根本无从知晓,甚至不觉察到时间的流逝。只有到了有一天,有一个导火索,引燃了郁闷许久的心。才会发现,一切都改变了那么多。这时,再看年轻的他们,有些觉得不可理会,有些,却泪流满面。
也许,你曾经有过一段没有起始,也没有结束的爱情。你暗恋她,可是却小心翼翼。其实一切都没有结果,可是就如患上臆想症一样,你觉得这样,就已经幸福,你的心情,会因为每天能够见到她而感到快乐不已。为了她,你试图每天用自己有限的生活轨迹的和她产生交集。其实一切都没有结果,你甚至不和她说话。算了吧,这是你的柏拉图式的爱情。
可是,但心境在不断的进化,你到了无论如何都要回忆过往的时候。你才发现,那时的爱情是多么的有意义。你还记得她,记得和她的每一个细节,每一次表现。你觉得这样,是一种幸福。可是,这一切也都是你的臆想。
多愁善感的人总是这样反反复复,这就是他们的生活,这就是他们的幸福。
献给所有,我暗恋过的女孩们。

分类: 杂想随笔 标签:

自说自话

2010年12月6日 没有评论

她就像一个吟唱诗人,自说自话,也不管你是否在意,或者是否听懂,诉说自己的感受。我不明白,但也会在突然间,明白一点。含义在话之外,要表达的是自说自话这件事的本身所体现的含义。重点在这个状态。

分类: 杂想随笔 标签: