Unity3D学习笔记1——Unity大法好呀

来源:互联网 发布:安卓版电子狗软件 编辑:程序博客网 时间:2024/06/05 08:05

最近我好像涨粉了。。。

是的,被C++和OSG折磨的不成人样的博主我决定投身Unity了。毕竟毕业要紧,毕业要紧。但还是会不断学习C++、图形学、OSG等的基础开发,也会更新相关的博客记录一下学习过程。

最近在跟着siki老师学习Unity的入门课程,还有3D塔防游戏的搭建,感觉确实很强大,也很适合不太会写代码的人,比如我。

siki老师对新手太友好了,问了问题也会很细致的回复。


——————————————————————————————分割线——————————————————————————————————————

学习Unity过程中的几个关键词:场景Scene,游戏物体GameObject,组件Component

很新鲜的词: 刚体组件Rigidbody:模拟物理效果,添加刚体后的游戏物体将具有物理属性。

通过脚本(C Sharp)向rigidbody发命令,来控制物体运动。脚本也是一种组件。

接下来是学习过程中的一些记录

1、监听键盘、鼠标事件,控制相机移动。

这个在OSG中要实现这个功能,需要用到osgGA::GUIEventAdapter类中的方法,重载handle函数并监听键盘事件。怎么都要十几行代码吧,还得写一个EventHandler。

然而在Unity中,给Main Camera添加了一个ViewController的脚本,在Update()函数中,Update()会在每一帧都调用。只用了4行代码就实现了。而且C sharp确实比较容易懂。

void Update () {        float h = Input.GetAxis("Horizontal");        float v = Input.GetAxis("Vertical");        float mouse = Input.GetAxis("Mouse ScrollWheel");        transform.Translate(new Vector3(h * speed, mouse * mouseSpeed, v * speed) * Time.deltaTime, Space.World);}
键盘和鼠标的事件监听都放在了Input类中的GetAxis方法。不同的值代表不同的事件。

让我们走进Unity Scripting API..

public static float GetAxis(string axisName); 

返回由axisName确定的值。对于键盘和游戏手柄,这个值将在-1和1之间。如果是鼠标的movement,鼠标的移动量会乘上什么axissensitivity

Returns the value of the virtual axis identified by axisName.

The value will be in the range -1...1 for keyboard and joystick input.If the axis is setup to be delta mouse movement, the mouse delta is multiplied by the axissensitivity and the range is not -1...1.

This is frame-rate independent; you do not need to be concerned about varying frame-rates when using this value.


Horizontal代表了水平方向:也就是键盘上的A,D以及方向键的左右。用h来判断是向左还是向右

Vertical代表了竖直方向:也就是W,S和方向键的上下。用v来判断是向上还是向下

Mouse ScrollWheel:监听鼠标滚轮的滚动。用mouse来判断滚轮是向上滚还是向下滚。

这里在transform.Translate()方法中,(有点类似OSG了),

第一个参数是一个三维向量,包含了三个方向的运动量。speed和mouseSpeed都定义为公有变量,可以在Unity的Inspector界面中进行直接修改参数,不需要在代码中进行修改,这一点真的很强大。然后和乘上Time.deltaTime表示每一帧的时间,这样速度乘上时间就是该帧所运动的距离。

第二个参数是Space.World,意思是这个物体是在世界空间进行移动的,是相对整个世界坐标系的意思吧。

2、用StartCoroutine和yield return来控制敌人的生成

其实就是在场景渲染的过程中,另开了一条支线来控制一些敌人的生成,暂停生成等。

StartCoroutine,字面意思,开启协同程序。

yield return是迭代器块返回调用迭代的地方。

一个协程的执行,可以在任何地方用yield语句暂停。yield return的值决定了什么时候恢复执行。当用到yield语句,协同程序被暂停,先返回开始协程的地方,再暂停。

3、Awake()和Start()

这两个方法都是继承自MonoBehaviour的。这是我在写代码时比较困惑的地方,只有查官方手册。

Awake()  Description

Awake()方法在脚本实例被加载时调用。Awake是用来在游戏开始之前,进行对变量或者游戏状态的初始化。Awake在脚本的生命周期内只会被调用一次。Awake会在所有游戏物体都初始化之后才会被调用。需要使用Awake来设置脚本之间的references,用Start方法来传递消息。Awake方法比Start方法早调用。这样可以通过Awake方法来控制脚本的初始化顺序。Awake不能作为协同程序。

Start() Description

Start在一个脚本被激活时,在所有的Update方法第一次被调用前调用。类似Awake函数,在脚本的生命周期中只调用一次。区别在于,Awake是在脚本被创建时,载入时就被调用,而Start要在一个脚本被enabled之后才被调用。如果脚本没有在初始化的时候被启动,Start和Awake不会在同一帧被调用。

Awake函数在场景中的物体加载后,在Start方法之前被调用。当物体A的初始化代码需要依赖物体B的初始化时这一点就很有用。B的初始化应该在Awake里,A的初始化可以在Start方法里
当一个物体是在游戏进行中被实例化时,他们的Awake方法会在场景物体的Start方法被调用后自动被调用。





阅读全文
1 0
原创粉丝点击