unity3d作业4

1、基本操作演练【建议做】

下载 Fantasy Skybox FREE, 构建自己的游戏场景
写一个简单的总结,总结游戏对象的使用

在这里插入图片描述
由于下载Fantasy Skybox FREE需要更新到unity2017.3.1,我这里就不做具体操作了。

一般步骤如下:
1建立天空盒
2把所需要的贴图放入Assert中
3创建Material,并将Shader的值改为Skybox/6 Sided
4把天空盒每个面的贴图都贴上去
5创建一个Terrain,然后可在Inspector面板上对地形进行修改。
6将地表的大概形状弄好后,就是把草地,树木等植被弄上去就好
7下载树木和草地的资源并把这些资源加到地面
8把天空盒安置在摄像头上。





2、编程实践

牧师与魔鬼 动作分离版
【2019新要求】:设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束

动作管理器的设计
为了用一组简单的动作组合成复杂的动作,我们采用 cocos2d 的方案,建立与 CCAtion 类似的类。设计思路如下:
设计一个抽象类作为游戏动作的基类
设计一个动作管理器类管理一组游戏动作的实现类
通过回调,实现动作完成时的通知
这样的目的是让程序可以方便的定义动作并实现动作的自由组合,使得:
1.程序更能适应需求变化
2.对象更容易被复用
3.程序更易于维护
在这里插入图片描述
在这里插入图片描述

核心代码与设计解读:
裁判类Referee

using UnityEngine;
using System.Collections;

public interface Referee{
    void setLose();
    void setWin();
    void check(int a,int b,int a_,int b_);
}

裁判类有setLose()、setWin()和check()三个函数

动作基类(SSAction)

using UnityEngine;
using System.Collections;

public class SSAction : ScriptableObject {

    public bool enable = true;
    public bool destory = false;
    public GameObject gameobject { get; set; }
    public Transform transform { get; set; }
    public ISSActionCallback callback { get; set; }


    protected SSAction() { }

    // Use this for initialization
    void Start () {
	    throw new System.NotImplementedException();
	}
	
	// Update is called once per frame
	void Update () {
	    throw new System.NotImplementedException();
	}
}

设计要点:

1.ScriptableObject 是不需要绑定 GameObject 对象的可编程基类。这些对象受 Unity 引擎场景管理
2.protected 防止用户自己 new 对象
3.使用 virtual 申明虚方法,通过重写实现多态。这样继承者就明确使用 Start 和 Update 编程游戏对象行为
4.利用接口(ISSACtionCallback)实现消息通知,避免与动作管理者直接依赖

简单动作实现

public Vector3 target;
    public float speed;
    private SSMoveToAction() { }
    public static SSMoveToAction GetSSAction(Vector3 target, float speed)
    {
        SSMoveToAction action = ScriptableObject.CreateInstance<SSMoveToAction>();
        action.target = target;
        action.speed = speed;
        return action;
    }

    public void Update()
    {
        this.transform.position = Vector3.MoveTowards(this.transform.position, target, speed * Time.deltaTime);
        if (this.transform.position == target)
        {
            this.destory= true;
            this.callback.SSActionEvent(this);
        }
    }

    public void Start()
    {
        
    }

设计要点:

1.让 Unity 创在这里插入代码片建动作类,确保内存正确回收。别指望手机开发者是 c 语言高手。
2.多态。C++ 语言必申明重写,Java则默认重写
3.似曾相识的运动代码。动作完成,则期望管理程序自动回收运行对象,并发出事件通知管理者。


顺序动作组合类实现

设计要点:

1.让动作组合继承抽象动作,能够被进一步组合;实现回调接受,能接收被组合动作的事件
2创建一个动作顺序执行序列,-1 表示无限循环,start 开始动作。
Update方法执行执行当前动作
3。SSActionEvent 收到当前动作执行完成,推下一个动作,如果完成一次循环,减次数。如完成,通知该动作的管理者
4.Start 执行动作前,为每个动作注入当前动作游戏对象,并将自己作为动作事件的接收者
5.OnDestory 如果自己被注销,应该释放自己管理的动作。
这是标准的组合设计模式。被组合的对象和组合对象属于同一种类型。通过组合模式,我们能实现几乎满足所有越位需要、非常复杂的动作管理。

动作事件接口定义

using UnityEngine;
using System.Collections;

public enum SSActionEventType : int { Started, Competeted }

public interface ISSActionCallback
{
    void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted,
        int intParam = 0, string strParam = null, Object objectParam = null);
}

动作管理基类 – SSActionManager

这是动作对象管理器的基类,实现了所有动作的基本管理

成品图如下:
在这里插入图片描述
按钮分为组合按钮和单步按钮,d+p等按钮为组合动作按钮

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值