简单的2D探路者

时间:2014-06-06 22:31:36

标签: unity3d unityscript

好吧,我是一个非常优秀的程序员,但我是Unity和游戏开发的初学者,所以说实话,我真的不知道如何实现简单的交互式2D地图。

我想创建一个带有地图屏幕的2D平台游戏,我正在进行3D教程,所以我不认为2D开发会有很多学习曲线。

但是,我不知道如何制作地图。以下是我希望它在游戏中看到的一瞥:

map screen

将图片记入Mike Schley

以下是我认为我需要做的事情:

1)创建一个框并将地图纹理应用于它

2)为每个位置创建一个透明框,并将它们放置在与纹理上的重新定位相同的XY坐标上,并将框标记为“Plip”,“Peacemas”等...

3)创建一个框并将角色纹理应用于它

然而,这是我的知识极限。我需要能够做到以下几点:

1)根据当前位置将角色放置在城镇上。我认为这太难了。我们记录角色所在的位置,然后搜索该位置,然后将角色放在相同的坐标上。 (较低的z轴以防止像素对抗)

2)检测到某个位置的最快路线。最快的我并不是指距离,我的意思是我们需要经过的最少数量的地点。我认为最好的方法是在所有位置之间手动创建曲目:

track overlay

Unity中是否存在此功能?这种“跟踪”方法有名称吗?如果确实如此,那么检测哪条轨道上的轨道数量最少并将其作为我们将要沿着的轨道返回将是一件有点简单的事情。

在这里,我真的很欣赏一些伪代码,伙计们。我的意思是,这说起来容易做起来难。

假设我们在Plip,我们希望得到Turvail Trail。最快的方法是通过2个地点。其中一个可能是:

Plip > Field Whar Battles Hap'n > Great Squid Lake > Turnvail Trail

我们如何让角色跳上赛道a,然后b,然后d?当玩家说他们想去Turvail Trail时我对这个过程的看法:

  • 我们需要一个循环来返回一个包含我们需要的轨道标签的数组:

    [ 'A', 'B', 'd', 'E']

  • 不确定这个循环会是什么样子(想法请!)。我认为每个轨道都需要一个属性来存储它们结束的最终位置的位置。让我们调用这个属性end_location。我认为每个位置都应该存储从中引出的轨道。我们称这个属性为location_tracks。这样的事情可能是:


var requested_location // 'Turvail Trail'  
var current_location // 'Plip'

if(current_location != requested_location ){
    var tracks = current_location.location_tracks  //[a,f,g]

    for(var i = 0; tracks.length; i++){
        // and this is where I run out of steam.
        // this loops needs to select which track [a,f,d] is the best start to our journey. 
        // It would actually be easier if we were doing it by distance rather than how many 
        // locations we need to pass through, then we could use this function to log the 
        // track that ends up nearest our nearest location:
        // Vector3.Distance(tracks[i].end_location, requested_location); 

    }

 }

类似的东西。只需要一些想法的人。 Unity初学者,所以如果这是一个简单的解决方案Unity我已经处理过了,我不想深入了解。


  • 我们最终需要沿着我们的阵列['a','b','d','e']旅行。这一切都应该在Update函数吗?
  • 中完成

private var route : array; // ['a','b','d','e'] 
private var i : integer = 0;
private var last_route : gameObject;

function Update(){
    FollowTrack( route[i] );

    if(character.position == array[i + 1].position){
        i++;
    }
}

function FollowTrack(track_to_follow){
    if(last_route !== track_to_follow){
         // causes the character object to travel along the route passed to it
         last_route = track_to_follow;
    }   
}

这只是pseduo代码,可以给你一个想法。感谢

1 个答案:

答案 0 :(得分:0)

这不是最好的方法,但使用monoBehaviour可以轻松分配下一个点 首先创建几个空的gameObjects,然后将此组件附加到每个gameObject 使用检查器分配connectedPoint。

FindPath.js

var connectedPoint : GameObject[];
function GetPath(from : GameObject, to : GameObject, totalPath : ArrayList, oldList : ArrayList) {
    for(var go : GameObject in oldList)
        if(go == this.gameObject) return; //If this point is already add.

    oldList.Add (this.gameObject); //Add this new point to list

    if (this.gameObject == to) {
        totalPath.Add(oldList); //If this point is where you want to go, add list to totalPath and stop loop return to previous point
            return;
    }

    //Find next point
    for (var i : int = 0; i < connectedPoint.Length; i++) {
        if(connectedPoint[i] == from)
            continue; //Pass the point where you came from

        var copyList : ArrayList = new ArrayList();
        for(var go : GameObject in oldList) copyList.Add(go);

        var findPath : FindPath = connectedPoint[i].GetComponent(typeof(FindPath)) as FindPath;
        findPath.GetPath(this.gameObject, to, totalPath, copyList);
    }
}    

当你需要调用GetPath()并放置start和end gameObject时。

var from : GameObject;
var to : GameObject;
var totalPath : ArrayList = new ArrayList();
var newPath : ArrayList = new ArrayList();
var findPath : FindPath = from.GetComponent(typeof(FindPath)) as FindPath; //Use from point to start
findPath.GetPath(from, to, totalPath, newPath);

Debug.Log("Total get paths : " + totalPath.Count);
if (totalPath.Count != 0) {
    for(var i : int = 0; i < totalPath.Count; i++) {
        var path : ArrayList = totalPath[i] as ArrayList;
        Debug.Log("Path [" + i + "] step count : " + (path.Count-1));
    }
}    

然后你可以比较最小计数或距离。你可以给每个gameObject一个标签,以便更容易找到。