标签:unity3d
坐标系统
坐标系统在Unity3D开发过程中具有非常重要的作用,是游戏对象定位、移动、缩放、旋转等操作的基础。坐标系统包含以下基本概念:
绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。
要了解GUI元素的界面坐标系统的具体请看如下的地址:
世界坐标→本地坐标:
transform.InverseTransformDirection(Vector3.forward); 相反的转换函数是:Transform.TransformDirection。
cam.InverseTransformPoint(transform.position); 相反的转换函数是:Transform.TransformPoint。
世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。
屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。
视口坐标→屏幕坐标:camera.ViewportToScreenPoint();
视口坐标→世界坐标:camera.ViewportToWorldPoint();
资源元素
网格、材质、纹理、贴图和动画是资源模型中非常重要的元素,直接决定了资源在场景中的外观和行为表现。
Unity3D没有创建网格的工具,但是可以在常用的三维建模软件(如Maya、3ds Max等)中创建模型,然后导入到Unity3D中形成资源,这些资源可以被场景直接使用。
Unity3D支持读取fbx、dae、3ds、dxf和obj格式的文件,因此所有可以导出这些格式的软件都适用于Unity3D。
脚本交互
Unity3D脚本支持JavaScript、C#与Boo(.Net平台中与Python语法相似的一种静态语言),官方推荐使用JavaScript,但考虑到C#的面向对象支持程度与强大的类库,在大型游戏项目开发时建议使用C#。
前文提到过,脚本也是组件的一种,可以挂载到游戏对象中。游戏框架在脚本生命周期的流程节点处或特定事件发生时调用相应方法,实现游戏业务逻辑。因此,脚本开发最为重要的是明确其生命周期的关键流程环节,这些流程环节所关联的脚本方法和它们的执行时机,从而在合适的脚本方法中编写所需的业务逻辑代码。
下图描述了脚本生命周期的脚本方法调用流程与时机。
图中内容可简化为这样的方法执行次序:Awake --> Start --> Update --> FixedUpdate --> LateUpdate --> OnGUI --> Reset --> OnDestory
需要注意的是,必须所有脚本的Awake方法均执行完毕后才会开始执行这些脚本中的Start方法,而各脚本的Awake方法的调用顺序是随机的。因此,对象的创建可在Awake方法中实现,而对象的获取可在Start方法中实现,保证调用先后次序。
相机操作
相机是为玩家捕捉和显示世界的一种装置。在一个场景中你可以有数量不限的相机,它们可以被设置为任何顺序渲染,在屏幕上的任何地方渲染,或仅渲染屏幕的一部分。
相机可以被定制,被脚本化,或被子类化。对于益智游戏,相机通常处于静态显示全部视角。对于第一人称射击游戏,相机通常作为玩家角色的子对象,并将其放置在与玩家角色的眼睛等高的水平。对于赛车游戏,相机通常会跟随玩家角色所控制的车辆。
坐标系统的案例:
案例1——在鼠标点击的位置上绘制一张图片出来(关于绘制GUI界面坐标系与屏幕坐标系之间的关系)。
using UnityEngine;
using System.Collections;
public class test : MonoBehaviour {
//图片
public Texture img;
//储存鼠标的位置坐标
private Vector2 pos;
void OnGUI()
{
//鼠标左击,获取当前鼠标的位置
if (Input.GetMouseButton(0))
{
pos = Input.mousePosition;
}
//绘制图片
GUI.DrawTexture(new Rect(pos.x,Screen.height - pos.y,100,100), img);
}
}
案例2——坐标显示和坐标转换(这个是触摸方面的。如果没有触摸屏,那就将那个if去掉吧!)
using UnityEngine;
using System.Collections;
public class test: MonoBehaviour {
//场景的相机,拖放进来
public Camera camera;
//场景的物体
private GameObject obj;
void Start()
{
//初始化
obj = GameObject.Find("Plane");
}
void Update ()
{
//有触摸
if (Input.touchCount > 0)
{
print("世界坐标" + obj.transform.position);
print("屏幕坐标" + Input.GetTouch(0).position);
print("世界坐标→屏幕坐标" + camera.WorldToScreenPoint(obj.transform.position));
print("屏幕坐标→视口坐标" + camera.ScreenToViewportPoint(Input.GetTouch(0).position));
print("世界坐标→视口坐标" + camera.WorldToViewportPoint(obj.transform.position));
}
}
}
标签:unity3d
原文地址:http://blog.csdn.net/u010019717/article/details/38414771