【Unity闲谈】2D游戏的角色跟随,角色队列的实现

贴吧传送门:http://tieba.baidu.com/p/4295282467


· 实现效果

(GIF,但愿能动)



· 什么是角色队列?

所谓角色队列,就是多个角色按照贪吃蛇的走法,沿着前面角色的路线行走,从而形成的队列。这种东西经常出现在日式RPG游戏中,新手们把这个逻辑看成“走到离目标XX距离时停止”,实现后却事与愿违,今天就来说说这种逻辑到底怎么实现。


· 代码下载

FollowMovement.cs】http://download.csdn.net/detail/u011771335/9399239


· 实现思路

1、实时检测目标的位置,若 目标现在的位置与上次检查时的位置 的距离大于已知float _gap,就把现在的值add到List<位置>中。
2、实时检测List的count,只要count大于已知float _stopCount,就让自己走向List[0]记载的位置。
3、细节无需讨论。。。


· 代码截图

全部逻辑只需这个代码,挂载到跟着别人走的东西上,把被跟随的目标的Transform拖拽到public Transform Target;上即可。

【Unity闲谈】2D游戏的角色跟随,角色队列的实现_第1张图片【Unity闲谈】2D游戏的角色跟随,角色队列的实现_第2张图片

------------------------------------------在这里复制代码--------------------------------

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


[RequireComponent(typeof(Rigidbody2D))]


public class FollowMovement : MonoBehaviour {


public Transform TargetTF; //要跟随的目标
public float RecordGap = 0.2f; //目标移动多远记录一次距离
public float StopCount = 2f; //记录还剩多少时停止移动
public float WalkSpeed = 10f; //走速度
public float RunSpeed = 20f; //跑速度
public float SpeedLerpRant = 0.1f; //速度变化的缓动率
public float StartRunCount = 5f; //距离目标多远后开始跑(单位是List的Item数)
public bool Running {
get { return PosList.Count > StartRunCount; }
set { }
}


private Rigidbody2D Rig;
private List PosList = new List();


void Awake () {


Rig = GetComponent();
Rig.constraints = RigidbodyConstraints2D.FreezeRotation;
Rig.gravityScale = 0f;


}




void OnDisabled() {
//失去意识时清空记录
PosList.Clear();
}




void FixedUpdate() {

if (TargetTF) {
//清除已经到达的点
while (PosList.Count > 0 && Vector2.Distance(transform.position, PosList[0]) < RecordGap) {
PosList.RemoveAt(0);
}
if (PosList.Count > 0) {
//添加当前Target位置
if (Vector2.Distance(TargetTF.position, PosList[PosList.Count - 1]) > RecordGap) {
PosList.Add(TargetTF.position);
}
//处理移动
if (PosList.Count > StopCount) {
Rig.velocity = Vector2.Lerp(Rig.velocity, new Vector2(
PosList[0].x - transform.position.x,
PosList[0].y - transform.position.y
).normalized * (Running ? RunSpeed : WalkSpeed), SpeedLerpRant);
} else {
Rig.velocity = Vector2.Lerp(Rig.velocity, Vector2.zero, SpeedLerpRant);
}
} else {
PosList.Add(TargetTF.position);
}
}


}








}

----------------------------------------代码结束-----------------------------------------

你可能感兴趣的:(Unity技术向,unity3d,2D,游戏,跟随,队列)