经过长时间的磕磕碰碰、写写停停,总算是将这款麻雀虽小,五脏俱全的Dark Wonder做完了,感觉又对Unity有了更进一步的掌握。 这是一款3d类型的很小的一款RPG游戏,剧情也是很简单:主角(精灵)的心爱之人雨狐被邪恶的山神抓走了,主角需要将雨狐就出来。雨狐被关到围着栅栏的房子中,主角需要取得恐龙的帮助去摧毁栅栏,救出雨狐。要想取得恐龙的信任,主角需要修炼技能,杀死巨魔,取得巨魔肉,喂饱恐龙,才能够得到恐龙的帮助。说白了就是一个拯救公主的游戏。 游戏虽然剧情简单,但是完整做完也不是那么容易的。涵盖了Unity的很多基础操作知识,需要更多的反思与消化。 游戏开发日程: 1.创建完整的游戏地形; 2.完成主角的显示与控制; 3.游戏内环境的灯光环境效果; 4.修炼场模块的完成(修炼倒计时,技能图标等的显示); 5.巨魔模块的完成(巨魔的显示,简单的AI控制,巨魔孵化器); 6.人物技能的释放、攻击巨魔等的控制; 7.恐龙模块的完成(恐龙的显示,控制,攻击); 8.女主角的添加; 9.完成杀死巨魔后巨魔肉的产生; 10.玩家与恐龙的互动(对话,喂食,切换视角控制,使用恐龙破坏栅栏); 11.游戏胜利的条件; 12.游戏添加剧情,声音; 13.游戏的发布; 下面记录下在制作的过程中值得学习的地方: 一.创建完整的游戏地形 学习点: 1.视图操作认知: Iso视图下(平行视图下)
滚轮:放大缩小视图
鼠标右键移动:旋转视野(围绕焦点旋转视野)
鼠标左键:用来选择GameObject游戏物体
鼠标中建按下移动:用来平移视野
Persp视图(透视视图)下:
滚轮:放大缩小视图
鼠标右键移动:旋转视野(围绕当前视野位置旋转视野)
鼠标左键:用来选择GameObject游戏物体
鼠标中建按下移动:用来平移视野
Alt+鼠标左键:旋转视野(围绕焦点旋转视野)
2.根据预设的角色路径构建地形
在创建一个Terrain之后,首先创建的是一大片平地,此时作为一名初学者,你肯定会和我的反应一样,感到无从下手,不知道怎样子去有条理的做出完整的地形,哪些地方该放什么,多大,哪些地方设置为高地,哪些地方设置为河流,处于一种很混乱的状态。 此时我们的第一步就是在一块平地上面做出一个大致的路径预设,用比较显眼的物体显示出来,做出一条Path,正如上图一中间的那些红色的点,都是用一组Cube做出来的表示Path路径。这样子我们就可以很清晰的开始我们的地形构建了——在地形的外围用高地圈起来,路段的中央出构建河流等。这样做就比较有条理,很清楚该怎么去做,有着明确的目标性。 二.完成主角的显示与控制 学习点: 1.主角的显示: 对于这类npc的控制,基本上都是用模型添加到游戏环境中,然后加上 CharacterController,包含了一些Rigidbody的属性,类似于一个胶囊网格,我们需要让这个网格覆盖我们的角色区域。 2.角色的移动: 使用 SimpleMove方法实现角色的移动。 controller.SimpleMove(new Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed)); 采用的是给予角色速度让角色移动。 设置摄像机的跟随不需要再自己去详细的写脚本,可以直接将视角调整到适当的位置之后,使用Camera下:Align with view 将Camera放到与角色模型在同一挂件下,即可实现控制角色移动时Camera也跟着移动,快速设置相机的跟随。 三.游戏内环境的灯光环境效果 学习认识: 1.Directional light
平行光(模拟太阳光)
Color 光的颜色
Intensity 光照强度
Shadow Type 影子类型(None无 Hard 硬 Soft软-性能耗费比较好一点)
2.Point Light
模拟灯泡
Range 光照范围(球半径)
Color光的颜色
Intensity 光照强度
3.SpotLight
模拟手电筒
4.AreaLight
在游戏中我们使用平行光照来设置环境光,使用两个相反的平行光源,分别来设置正面和阴影部分光照渲染。 四.修炼场模块的完成(修炼倒计时,技能图标等的显示) 图片中使用的石头模型和粒子效果搭建的修炼场 学习点: 1.进入修炼场的检测: 这是在游戏中使用的很经常的一种方法,区域检测,无论是判定是否进去某一触发区域,还是进行攻击判定,或者进行移动区域限定都是使用这样的方法——使用触发器Collider(is Trigger)。使用各种类型的Collider设置好大小,如果是用来触发的就设置为Trigger,否则是碰撞器,会进行碰撞检测的。碰撞器可以用来限定角色的移动,比如河边、悬崖等不能让角色掉落下去(不然就可能出BUG)。 对于触发器: public void OnTriggerEnter(Collider other){ ***************** **************** } public void OnTriggerStay(Collider other){ ***************** **************** } public void OnTriggerExit(Collider other){ ***************** **************** } 分别是对于进入触发区域,在触发区域,离开触发区域的一个检测操作函数,在前面的太空大战中已经学习了相应的操作了。other是触发对象,可以对other.gameObject进行操作判定是否是符合触发操作的对象,进而进行其他处理。 2.修炼倒计时显示: 由于教程是旧版本的GUIText,在新版里面使用的是UI.Text,所以在使用该UI是应该在脚本的 直接获取不到的,所以在触发区域的控制脚本中要加上: using UnityEngine.UI; 然后public Text uiText; 这样就可以进行拖拽赋值,用 uiText.text = message;进行控制文本的显示。 脚本中使用计时器的常用方法: public float timer = 5f;
private float timerReset;
// Use this for initialization
void Start () {
timerReset = timer;
}
// Update is called once per frame
void Update () {
timer -= Time.deltaTime;
if (timer < 0)
{
************************
timer = timerReset;
}
}
3.控制控件的显示与隐藏: this.gameObject.SetActive(false/ture); 五.巨魔模块的完成(巨魔的显示,简单的AI控制,巨魔孵化器) 同样的采用 CharacterController进行控制 学习点: 1.简单的UI控制: 在游戏中设置的巨魔是按照停2s走5秒,走得方向每次都是随机生成一个角度,移动过程中让巨魔每帧移动0.1的角度
timer -= Time.deltaTime;
if (timer < 0)
{
if (idle)
{
transformToWalk();
}
else
{
transformToIdle();
}
}
if (!idle)
{
if (angle > 0.2f)
{
float temp = angle * 0.1f;
transform.Rotate(new Vector3(0, temp, 0));
angle -= temp;
}
//how to move
// transform.position += transform.forward * Time.deltaTime*speed;
trollController.SimpleMove(transform.forward * speed);
}2. 巨魔孵化器: 设计思想:指定一个位置隔一定的时间生成巨魔,设置巨魔总量上限。未达上限继续生成。 在游戏中也该也就是这样对于一处怪物点进行怪物的生成与刷新,生成的时间间隔也就是所谓的怪物的刷新周期。
public class TrollSpawn : MonoBehaviour {
public GameObject trollPrefab;
public static int trollCount = 0;
public static int trollMaxCount = 10;
public float timer = 5f;
private float timerReset;
// Use this for initialization
void Start () {
timerReset = timer;
}
// Update is called once per frame
void Update () {
if (trollCount < trollMaxCount)
{
timer -= Time.deltaTime;
if (timer < 0)
{
//spawn a troll
GameObject.Instantiate(trollPrefab,transform.position,Quaternion.identity);
trollCount++;
timer = timerReset;
}
}
}
}
六.人物技能的释放、攻击巨魔等的控制 学习点: 1.按键监听: Input.GetButton(); Input.GetButtonDown(); Input.GetButtonUp(); Input.GetAxis();//在Edit-〉Project Setting->Input里面可以进行设置Axis进而可以自定义监听。 Input.GetKey(); Input.GetKeyDown(); Input.GetKeyUp(); Input.GetMouseButton(); Input.GetMouseButtonDown(); Input.GetMouseButtonUp(); 举例:
if (Input.GetButtonDown("Fire1") && timer < 0)
{
//释放技能
// print("Magic");
GameObject.Instantiate(magicprefab, transform.position, Quaternion.identity);
timer = timerReset;
} 2.技能攻击触发:正如前面提到的一样,当按下攻击键后,便会释放技能效果(实际上也就是一个带有触发器的粒子效果)。 当技能触发器检测到怪物在技能范围内时,实现怪物的扣减生命值。 3. 关于技能释放后技能效果的移除: 使用 Destroy();方法 1.使用前面的计时器,当时间到达后GameObject.Destroy(this.gameObject); 2.Destroy(this.gameObject,lifeTimer); 3.使用携程(可以理解为Unity的线程,因为C#没有线程这一概念):
void Start()
{
StartCoroutine(destroyByTime(lifeTimer));
}
IEnumerator destroyByTime(float lifeTimer)
{
yield return new WaitForSeconds(lifeTimer);
Destroy(this.gameObject);
}
七 .恐龙模块的完成(恐龙的显示,控制,攻击) 同主角的控制,不过当按下攻击键时,需要播放恐龙的攻击动画 八.女主角的添加 学习点: 关于女主角头上的求救话语: 视频中使用的是3D Text是一个3D类型的Text对象,然而新版本中并不能找到,经过对比发现其实3d Text实际上就是加上了一个Text Mesh,所以我们只需要新建一个空的游戏对象,然后添加上Text Mesh即可得到一个3D Text。 九.完成杀死巨魔后巨魔肉的产生 学习点: 1.物品的爆率: 我们在游戏中常常遇到的游戏物品的爆率问题: 思路:当技能释放,触发怪物扣血,怪物血量值为0怪物死亡,此时应该生成随机数,用概率来解决爆率问题 例如:
if (Random.Range(1, 11) <= 5)
{
Meat._instance.plusMeat();
}
此时有50%的爆率 十 .玩家与恐龙的互动(对话,喂食,切换视角控制,使用恐龙破坏栅栏) 学习点: 1.OnGUI() 虽然说现在这种代码来控制GUI显示的方法已经不怎么使用了(不方便,不直观),但还是有了解的必要性。
OnGUI会在每一帧被调用,并且只有在运行时才能够看到。
1.检测主角到达女主身边
常用的:
GUI.Label(new Rect(), String);
bool res = GUI.Button(new Rect(), String);//此函数返回的是一个bool型变量,点击按钮为true
Rect矩形: 一个由x、y位置和width、height大小定义的二维矩形。 2. 切换视角控制 这个功能在很多游戏中都有用到。 因为同时只能够存在一个Camera所以,当开始时,要将恐龙的Camera禁用掉 当切换视角时,将恐龙的Camera启用, 人物的Camera禁用即可完成视角的切换 3.调用其他GameObject里的方法: 1〉 GameObject .GetControll();
2〉GameObject.GetComponent<Trex>().GetControll();
3〉 GameObject.SendMessage("FunctionName");
4.对话触发实现: 依旧是使用触发器进行触发检测,检测到触发后将GUI激活显示出来即可 十一.游戏胜利的条件 学习点: 方法:依旧是设置触发区域,解决。 2.Quit 当点击Quit时,Application.Quit(); 十二.游戏添加剧情,声音 学习点: 3d sound//在物体上面播放时,根据距离的远近监听到的声音大小不同 2d sound //播放时无差别,一般用来当作背景音乐 需要挂载Audio Listener才能够监听到声音。 注意:一个控件上面只能够挂载一个Audio source 例子:
public class MusicManager : MonoBehaviour {
public static MusicManager _instance;
public AudioSource audioScorce;
public AudioClip getMeat;
public AudioClip getTrex;
// Use this for initialization
void Start () {
_instance = this;
}
public void playMusicGetMeat()
{
this.audioScorce.PlayOneShot(getMeat);
}
public void playMusicGetTrex()
{
this.audioScorce.PlayOneShot(getTrex);
}
}
视图Scene的切换: 这里需要将所有需要的Scence加载进去后,后面的会有对应的0,1编号 Application.LoadLevel("ScenceName"\index); 十三.游戏的发布 将游戏发布到PC平台上即可。 游戏完成。
——By Polaris_Aspire
爱生活,爱分享 |
Dark Wonder(暗黑奇侠)学习笔记
最新推荐文章于 2019-07-24 22:46:44 发布