一、人物、怪物移动
(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调用相应的增益或者减益效果。