第三章 地牢吞噬者

本文详细介绍了游戏开发中的人物和怪物移动机制,包括射线检测障碍物、移动方向变更以及地图数据的加载。同时,提到了地图数据的文本文件格式,以及如何使用编辑器扩展来创建地图。此外,还涵盖了组件透明度渐变、动画效果如人物转向和攻击动画,以及镜头旋转的实现。最后,讨论了宝箱系统的设计,包括随机效果和增益/减益处理。
摘要由CSDN通过智能技术生成

一、人物、怪物移动

(1)、人物移动

1.读取人物移动方向move_direction(以下简称mdir,类型为Vector3)

2.按下按键后人物不会立马改变移动方向,而是通过判断是否可以沿着该方向移动,方法为射线检测按下方向是否有障碍物,如有则禁止向该方向移动,并继续沿当前方向mdir移动,如果没有则储存该方向,判断人物在地图方格中央时向该方向移动。

 

public bool WallCheck(Vector3 direction)
{
    Vector3 tpos = transfrom.position;
    return Physics.Raycast(tpos, direction, 1.0f); //判断dir方向是否有障碍物
}


public void Move(float t)
{
    Vector3 pos = transform.position;


    pos += m_direction * SPEED * t;


    bool across = false;
    if ((int)pos.x != (int)transform.position.x)
        across = true;
    if ((int)pos.z != (int)transform.position.z)
        across = true;


    Vector3 near_grid = new Vector3(Mathf.Round(pos.x), pos.y, Mathf.Round(pos.z));
    m_current_grid = near_grid;
    Vector3 forward_pos = pos + m_direction * 0.5f;
    if (Mathf.RoundToInt(forward_pos.x) != Mathf.RoundToInt(pos.x) ||
        Mathf.RoundToInt(forward_pos.z) != Mathf.RoundToInt(pos.z))
    {
        Vector3 tpos = m_current_grid;
        tpos.y -= HITCHECK;
        if (Physics.Raycast(tpos, m_direction, 1.0f))
        {
            pos = near_grid;
            across = true;
        }
    }
    m_move_vector = (pos - transform.position) / t;
    transform.position = pos;
}

3.在向前移动过程中如果检测前方有障碍物则停止移动。

(2)、怪物移动

1.同上1

2.怪物通过实时监测与玩家的相对位置,根据怪物追踪模式选择相应的路线。如果无法向目标方向移动则向反方向运动,并为更改移动方向赋予时间条件,当经过一定时间之后方可更改方向,以防频繁更改方向导致抽搐。

二、地图数据

1、文本文件格式

设定符号与对象的对应关系

1

c

宝石

2

*

砖块

3

p

骑士

4

1-4

幽灵(4种)

5

s

6

t

宝箱

7

x

空白

文字之间用都好间隔开,这种文件形式叫做CSV,可以用excel进行编辑

地图数据
11,12,,,,,,,,,,,,,,, 

*,*,*,*,*,*,*,*,*,*,* 
*,c,c,c,c,c,c,c,c,c,* 
*,c,*,*,*,*,*,*,*,c,* 
*,c,c,c,c,p,c,c,c,c,*
*,c,*,c,*,s,*,c,*,c,* 
*,c,*,c,*,c,*,c,*,c,* 
*,c,c,c,*,c,*,c,c,c,* 
*,*,*,c,*,t,*,c,*,c,* 
*,c,c,c,*,c,*,c,c,c,* 
*,c,*,*,*,c,*,*,*,c,* 
*,c,c,c,c,c,c,c,c,1,* 
*,*,*,*,*,*,*,*,*,*,*


加载地图数据
private void LoadPromAsset(TextAsset assset)
    {
        map_data.offsetpos = new Vector2(MAP_ORIGIN_X,MAP_ORIGIN_Z);
        String content = assset.text;
        System.StringSplitOptions options = System.StringSplitOptions.RemoveEmptyEntries;//删除空元素
        String[] lines = content.Split(new char[] {'\r', '\n'}, options);
        char[] spliter = new char[] {','};
        String[] size = lines[0].Split(spliter, options);//第一行是尺寸
        map_data.width = int.Parse(size[0]);
        map_data.length = int.Parse(size[1]);
        char[,] data = new char[map_data.length,map_data.width];
        for (int i = 0; i < map_data.length; i++)
        {
            String[] temp = lines[map_data.length - i].Split(spliter, options);
            for (int j = 0; j < map_data.width; j++)
            {
                data[i, j] = temp[j][0];
            }
        }


        map_data.data = data;
    }

2.地图扩展编辑器在编辑器上直接确认地图形状更加有针对性进行地图制作

将脚本放在editor文件夹下即可添加编辑功能

using UnityEngine;
using UnityEditor;//使用了editor命名空间
[CustomEditor(typeof(Map))]
public class MapModelCreator : Editor {//继承自editor类
   public override void OnInspectorGUI() {
       DrawDefaultInspector ();//执行标准功能
       if (GUILayout.Button("Create Map Model")) {
         Map map = target as Map;
          map.CreateMap();//执行函数
      }
   }
}

三、组件渐变透明

static public bool ComeToTransparent(Image g,float speed)
    {
        float Alpha = g.color.a;
        if (Alpha > 0.01)
        {
            Alpha += Time.deltaTime * speed*-1;
            g.color = new Color(g.color.r,g.color.g,g.color.b,Alpha);
            return false;
        }


        return true;
    }
    static public bool ComeToDisTransparent(Image g,float speed)
    {
        float Alpha = g.color.a;
        if (Alpha < 1)
        {
            Alpha += Time.deltaTime * speed;
            g.color = new Color(g.color.r,g.color.g,g.color.b,Alpha);
            return false;
        }
        return true;
}

四、动画效果

1.人物转方向

Quaternion quaternion = Quaternion.LookRotation(m_grid_move.GetDirection());
float t = 1.0f - Mathf.Pow(0.75f, Time.deltaTime * 30.0f);
transform.localRotation = Quaternion.Lerp(transform.localRotation, quaternion, t);

2.攻击动画 移动动画

通过获得动画组件,适时调用预制动画。

Animator.SetTrigger  Animator.SetBool等

五、镜头旋转

设置不同的时间,推近时间与拉远时间。当物体进行攻击动画时对物体进行判断mdir判断,如果为横向移动则画面直接拉近,如果为纵向则画面移动至侧方并朝向改变。推近及拉远都进行差值运算,使图像更改更加平滑。

float fov = Mathf.Lerp(60.0f, 20.0f, rate);
this.GetComponent<Camera>().fieldOfView = fov;

六、宝箱设置

为宝箱增添各种随机效果,通过不同效果对不同对象产生增益或减益效果。并通过SendMessage调用相应的增益或者减益效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值