多媒体和建模零基础Unity学习笔记Unity技术分享

Unity学习笔记 - Roguelike Tutorial(下

2016-08-26  本文已影响322人  pirateH

// Unity学习笔记(零基础入坑),自用的同时也许也能帮助别人

// 初学者,没太多编程基础,所以难免可能会有写错的地方,请见谅

//详细教程视频都有,笔记只记重点

传送门:Unity学习笔记 - Roguelike Tutorial(上)

             Unity学习笔记 - Roguelike Tutorial(中)


十一、UI和关卡衔接


1. UI元素摆放

Hierarchy下新建Canvas;

Canvas下新建Image(“LevelImage”),关卡开始的黑色背景;

LevelImage调整Anchor Presets;

Canvas下新建Text(“LevelText”),显示当前第几关(Day x);

LevelText调整Anchor Presets,Horizontal/Vertical Overflow都选为Overflow,即文本可溢出,修改字体、字号、Alignment;

LevelText挂到LevelImage子节点上;

关卡开始界面完成

Canvas下新建Text(“FoodText”),显示当前分数;

FoodText调整类似LevelText,只是为底边居中,FoodText放到LevelImage的下层;

FoodText位置微调:

锚点(Anchors)上移0.1(虚线位置)后,Pos Y会变成负值,改成0后,文本上移。


2. UI脚本控制与关卡衔接


Game Manager C#

(1)变量和namespace声明:

levelStartDelay 就是关卡开始界面显示的时间

(2)关卡加载触发函数—— OnLevelWasLoaded

Unity API说明中没有找到OnLevelWasLoaded, 只在unity手册的“事件函数执行顺序”中找到这样一个说明:

OnLevelWasLoaded:This function is executed to inform the game that a new level has been loaded.

http://docs.unity3d.com/Manual/ExecutionOrder.html

运行顺序应该是:awake -> onlevelwasloaded -> start

那么在运行首关时,OnLevelWasLoaded会不会运行? 在网上有看到说,5.3以前首次加载场景不会运行,但是5.3开始就有问题了,这个要等我之后试试才知道。

网上的讨论:

https://community.unity.com/t5/Editor/5-3-OnLevelWasLoaded-int-behavior-different-in-editor-then-build/m-p/2491118

http://forum.unity3d.com/threads/2d-roguelike-q-a.297180/page-12

(3)在InitGame函数中,控制UI元素的显示

又一次用到了Invoke;.GetComponent还可以这么用。

(4)Update的条件判断中加入了doingSetup

不过有一点问题的是,这里加入doingSetup的直接作用是让敌人在显示开始界面时不会移动,间接作用是player最多能移动一步。因为playerTurn默认值是true,也就是说,显示开始界面时,玩家可使player移动一步。

(5)GameOver函数中加入结束画面的显示

再说说这个enabled

设定game object用SetActive,设定component用enabled;

这里之所以需要让当前的GameManager脚本失效,应当是为了使游戏在game over后整体停滞下来。

参考资料:http://unity3d.com/cn/learn/tutorials/topics/scripting/enabling-and-disabling-components

Player C#:

(6)FoodText分数显示

Start和AttemptMove中加入:

       foodText.text = "Food: " + food;

OnTriggerEnter2D的if (other.tag == "Food"){}中加入:

        foodText.text = "+" + pointPerFood + " Food: " + food;

OnTriggerEnter2D的else if (other.tag == "Soda"){}中加入:

        foodText.text = "+" + pointPerSoda + " Food: " + food;

LoseFood(int loss){}中加入:

        foodText.text = "-" + loss + " Food: " + food;

编辑器中,foodText指向FoodText。

完成!

十二、添加音乐和音效

编辑器 - 创建音源:

新建empty object:SoundManager;

SoundManager上添加两个Audio Source组件,一个用于播bgm,一个用于播音效。

C# SoundManager - 播放函数:

1. 变量

编辑器中efxSource和musicSource分别指向一个audio source。

musicSource指向的audio source的AudioClip选上bgm的音频,并选中play on awake和loop。

bgm直接启动播放,音效通过脚本控制播放。

2. Awake中建立单例模式

3. 单曲播放函数

4. 多曲随机播放函数

从一组音频(clips)中随机选取一个播放,并且对音高做随机变化处理。

随机播放多个备选音频,以防止重复感。

params

The “params” keyword allows us to parse in a comma separated list of arguments of the same type, as specified by the parameter.

C# Player - 播放player相关音效 - 移动、吃分、死掉:

1. 创建指向每个音频的变量

编辑器中,分别选择对应的音频

2. player移动时的音效

使用的多曲随机播放函数。

3. player吃掉food和soda时的音效

使用的多曲随机播放函数。

4. player死掉时的音效

使用的单曲播放函数(因为一局就会死掉一次啊),同时停止bgm的播放。

C# Enemy - 播放Enemy攻击player时的音效:

C# Wall - 播放墙收到player攻击时的音效:

@_@音乐和音效完成!

十三、添加移动端触屏控制功能

C# Player

变量

private Vector2 touchOrigin = -Vector2.one;    

Vector2.one: Shorthand for writing Vector2(1, 1).

Vector2 with both of its components set to one.

https://msdn.microsoft.com/en-us/library/microsoft.xna.framework.vector2.one.aspx

touchOrigin用于存储玩家手指接触屏幕的起始位置;

初始值是 -Vector2.one (屏幕外的一个点)的作用是,没有触摸前这个值都是一个屏幕外的“假值”(试了一下,触摸点坐标大概是以屏幕左下角为0,0点的),以此来分辨是否有触摸发生。

We're going to use touchOrigin to record the place where the player's finger started touching our touch screen.

We're going to initialize it to -Vector2.one which is going to be a position off the screen. This means that our conditional that we're going to use to check and see if there has been any touch input will initially evaluate to false until there actually is a touch, which changes touchOrigin.

Touch.position

The position of the touch in pixel coordinates.

划分不同平台的输入获取方式

获取触摸滑动的位移方向

#else ≈ #elif UNITY_IOS||UNITY_ANDROID||UNITY_WP8||UNITY_IPHONE

Input.touchCount 这个是同一帧内获得的触摸点个数。

Touch myTouch = Input.touches[0];  这个是同一帧内获得的触摸点列表,因为是单点触控模式所以是touches[0],即只有首个点生效。

Input.touchCount:

Number of touches. Guaranteed not to change throughout the frame. (Read Only)

Input.touches

Returns list of objects representing status of all touches during last frame. (Read Only) (Allocates temporary variables).  Each entry represents a status of a finger touching the screen.

疑问:

touchOrigin.x = -1; 那一句我给注掉试了下,并没有什么异常

Unity Remote 5亲测很好用!不用Mac,不用打包,iphone上装个Remote 5客户端,连上电脑,Edit > Project Settings > Editor中的Device里就会看到你的iphone啦,运行手机上的Remote,点击Play,手机上就可以玩了!(虽然手机其实只是作为一个输入&显示器)

2015.08.26

上一篇下一篇

猜你喜欢

热点阅读