必威体育Betway必威体育官网
当前位置:首页 > IT技术

牧师与恶魔——动作分离版

时间:2019-10-29 05:43:16来源:IT技术作者:seo实验室小编阅读:83次「手机版」
 

牧师与魔鬼

Priests and Devils ——动作分离版

完整工程文件在github(https://github.com/JennySRH/3DGame/tree/master/PriestsAndDevils2)

游戏视频https://www.bilibili.com/video/av68091576

在这里插入图片描述

在之前的牧师与恶魔的游戏制作中,我们使用Firstcontroller来控制游戏中人物的动作,这样写出了的代码低内聚高耦合。在这里,我们对上一版的牧师与恶魔进行更新迭代,将动作从FirstController中分离出来,减少程序的耦合提高内聚性。

我们首先创建一个类Action用来管理所有游戏事物的动作,然后在FirstController中创建这个类的实例,用来管理游戏事物的运动。

    public Action actionManager;   //动作管理

在这个版本中,游戏事物的所有动作都由Action来管理,而游戏事物的信息、状态等都由RoleBoat来管理。比如游戏角色(牧师和恶魔)上下船的动作,由FristcontrollerAction进行通信,让Action来管理动作的改变,同时告知Role进行状态的改变。

FirstController的代码如下所示:

if(obj.position == 0 && obj.position == boat.position && boat.num < 2)
{
    boat.num++;
    if(boat.BoatState[0] == 0)
    {
        // 更改model
        obj.getBoat(1);
        // 更改动作
        actionManager.getBoat(obj, 1);
        boat.BoatState[0] = MapName(name);
    }
    else
    {
        obj.getBoat(2);
        actionManager.getBoat(obj, 2);
        boat.BoatState[1] = MapName(name);
    }
}

Action中的相关代码如下所示:

    public void getBoat(Role role, int i)
    {
        if (i == 1)
        {
            role.character.transform.position = new vector3(0, -3, 4);
        }
        else if (i == 2)
        {
            role.character.transform.position = new Vector3(0, -3, 6);
        }
        else if (i == 3)
        {
            role.character.transform.position = new Vector3(0, -3, -4);
        }
        else
        {
            role.character.transform.position = new Vector3(0, -3, -6);
        }
    }

Role中的相关代码如下所示:

    public void getBoat(int i)
    {
        position = 2;
        if (i == 1)
        {
            boatPos = 0;
        }
        else if(i == 2)
        {
            boatPos = 1;
        }
        else if(i == 3)
        {
            boatPos = 1;
        }
        else
        {
            boatPos = 0;
        }
    }

其余的更改基本跟上下船相同,Action类代码如下所示。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Action 
{

    public void GetBoat(Role role, int i)
    {
        if (i == 1)
        {
            role.character.transform.position = new Vector3(0, -3, 4);
        }
        else if (i == 2)
        {
            role.character.transform.position = new Vector3(0, -3, 6);
        }
        else if (i == 3)
        {
            role.character.transform.position = new Vector3(0, -3, -4);
        }
        else
        {
            role.character.transform.position = new Vector3(0, -3, -6);
        }
    }


    public void MoveToOrigin(Role role)
    {
        role.character.transform.position = role.origin;
    }

    public void MoveToDest(Role role)
    {
        role.character.transform.position = role.dest;
    }


    Role MapNumToRole(int num, Role []Priests, Role []Devils)
    {
        Role tmp = null;
        if (num < 4 && num > 0)
        {
            tmp = Priests[num - 1];
        }
        else if (num >= 4 && num <= 6)
        {
            tmp = Devils[num - 4];
        }
        return tmp;
    }

    public void MoveBoat(Boat boat, Role[] Priests, Role[] Devils)
    {
        // 船移动
        Vector3 Current = boat.thisboat.transform.position;
        Vector3[] Target = { new Vector3(0, -3, -5), new Vector3(0, -3, 4) };
        Vector3 tar = Target[boat.movestate - 1];
        int a = boat.movestate - 1;
        if (Current == tar)
        {
            boat.movestate = 0;
        }
        boat.thisboat.transform.position = Vector3.MoveTowards(Current, tar, 8f * Time.deltaTime);
        Vector3[,] targets = {
                { new Vector3(0, -3, -5), new Vector3(0, -3, -6) },
                { new Vector3(0, -3, 5), new Vector3(0, -3, 6) }
            };

        for (int i = 0; i < 2; i++)
        {
            int b = i;
            Role r = MapNumToRole(boat.BoatState[i], Priests, Devils);
            if (r != null)
            {
                Vector3 cur = r.character.transform.position;
                r.character.transform.position = Vector3.MoveTowards(cur, targets[a, b], 8f * Time.deltaTime);
            }
        }
    }
}

在这里插入图片描述

文章最后发布于: 2019-09-25 18:22:17

相关阅读

淘宝电脑版的必备工具在哪里?

我们浏览手机淘宝最多的是其中的商品,其次就是我的订单,相信很多朋友都不知道手机淘宝里面有个必备工具,里面有很多非常实用的小工具

750宽简单淘宝搭配套餐模版代码

搭配套餐 为您省钱 输入文字说明,商品信息。搭配套餐说明等等. 原价:100+200=300元 250

视觉中国人人喊打,版权流氓死期将至?

4月10日晚,一张图片引爆了朋友圈与天文界&mdash;&mdash;人类首张黑洞照片面向全球同步发布。也就是说,爱因斯坦的预言真的灵验了!(图

检测是否为IE浏览器及IE浏览器的版本

1、检测是否为IE浏览器方法一 function isIE() { if (!!window.ActiveXObject || "ActiveXObject" in window) retu

Visual studio 的各个版本下载地址

Microsoft Visual Studio 6.0 下载:英文版360云盘下载:http://l11.yunpan.cn/lk/sVeBLC3bhumrI英文版115网盘下载:http://115.co

分享到:

栏目导航

推荐阅读

热门阅读