将unity2D中的对象移向另一个单击的对象

时间:2015-01-18 16:56:35

标签: unity3d unityscript unity3d-2dtools

  • 我有一个名为' 播放器的对象'在我的场景中。
  • 我还有多个名为' Trees '
  • 的对象。

现在,每当用户点击“树”时,我都会喜欢这个“播放器”'慢慢地移动到那个位置(使用Lerp或moveTowards)对我来说都是O.K。


现在我对此代码有2个问题:

我希望这段代码是通用的

每当我点击树对象时,我都希望将播放器移向。我不想写这个脚本并将其附加到每个树对象

  • 我应该把脚本放在哪里?

    目前,我将此代码附加到每个树对象

  • 我应该如何将其写下来以便它适用于每个树对象 在场景中?

如果在移动时再次单击,则取消上一个移动并开始移动到新位置

  • 我应该如何编写它,以便在我点击另一个对象的时候 播放器正朝着被点击的另一个对象移动,玩家停止向其前一个位置移动,并开始 走向新的一点。

我在调整新的UnityScript时遇到了一些麻烦。我严格来自Javascript背景,看起来它们中的两个似乎是语义非常不同的语言。所以如果有人用代码回答这个问题(这就是我想要的:)),我也很感激一些冗长的评论。


我目前这样做:

var playerIsMoving = false;
Public playerObject: Gameobject; //I drag in the editor the player in this public var

function update(){  

   var thisTreePosition = transform.point; //this store the X pos of the tree
   var playerPosition = player.transform.point;

   if(playerIsMoving){
    player.transform.position = Vector2.MoveTowards(playerPosition, thisTreePosition, step);
   }

}

function OnMouseDown(){
    playerIsMoving = true;
}

我在家里写这篇文章,我没有Unity,我忘记了代码语法,因此期望上面的代码有拼写错误或问题,在工作中它工作得很好,除了非常粗暴和简单。

2 个答案:

答案 0 :(得分:3)

我建议你把动作脚本放在播放器上。如果你使用Raycast来测试你是否打树了?

http://docs.unity3d.com/ScriptReference/Physics.Raycast.html

Vector3 positionToWalkTo = new Vector3();

void Update() {
        if (Input.GetMouseButtonDown(0)) {
            RaycastHit hit;
            Ray ray = new Ray(transform.position, direction);

            if (Physics.Raycast(ray, out hit))
               if (hit.gameObject.tag.Equals("tree")){
                  positionToWalkTo = hit.gameObject.transform.position;
               }

        }

        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, positionToWalkTo, step);
    }

要运行这样的东西,你应该标记所有的树。

'的JavaScript'

var target: Transform;
// Speed in units per sec.
var speed: float;

function Update () {

        if (Input.GetMouseButtonDown(0)) {
             var hit: RaycastHit;
             var ray = Camera.main.ScreenPointToRay (Input.mousePosition);

        // Raycasting is like shooting something into the given direction (ray) and hit is the object which got hit
        if (Physics.Raycast(ray, hit)) {
            if (hit.gameObject.tag = "tree")
                target = hit.gameObject.transform.position;  // Sets the new target position
        }
    }

    // The step size is equal to speed times frame time.
    var step = speed * Time.deltaTime;

    // Move our position a step closer to the target.
    transform.position = Vector3.MoveTowards(transform.position, target.position, step);
}

答案 1 :(得分:1)

好的,所以我自己做了(用Freshchris的回答中的一些帮助)。

这是:

var target:Vector2;
var targetObject:GameObject;
var initialY:float;
var tolerance = 1;
var speed = 3;
var isMoving = false;

function Start(){
    target = transform.position; 
}

function Update () {

    if (Input.GetMouseButtonDown(0)) {
        var hit: RaycastHit2D = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); //raycast the scene

        // if we hit something
        if (hit.collider != null) {
            isMoving=true; //it should start moving
            targetObject = hit.collider.gameObject; //the target object 
            target = hit.collider.gameObject.transform.position;
        }
    }

    // The step size is equal to speed times frame time.
    var step = speed * Time.deltaTime;

    // if it should be moving - move it - and face the player to the correct direction
    if (isMoving){
        if(transform.position.x>target.x){
            gameObject.transform.localScale.x =  -0.7;
        }else {
            gameObject.transform.localScale.x =  0.7;
        }
        transform.position = Vector2.MoveTowards(transform.position, target, step);
    }

    // if it reached the target object by a specified tolerance, tell it to stop moving
    if(isMoving){
        if((transform.position.x < target.x+tolerance)&&(transform.position.x > target.x-tolerance)){
            print("position reached"); //this is fired just once since isMoving is switched to false just one line below
            print(targetObject);
            isMoving=false;
        }
    }
}