Dark Wonder(暗黑奇侠)学习笔记




        经过长时间的磕磕碰碰、写写停停,总算是将这款麻雀虽小,五脏俱全的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会在每一帧被调用,并且只有在运行时才能够看到。

常用的:
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激活显示出来即可

十一.游戏胜利的条件

学习点:
 1.检测主角到达女主身边
方法:依旧是设置触发区域,解决。
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
爱生活,爱分享 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值