将物体从一个位置移动到另一个位置

时间:2014-06-19 10:43:57

标签: unity3d

我在这里有这个代码,我试图在鼠标点击时将一个对象从一个位置移动到另一个位置,但是每次我运行它只是将弹丸对象在特定位置实例化,而它必须在一个特定位置实例化它对象位置

using UnityEngine;
using System.Collections;


public class Shoot : MonoBehaviour
{

    public GameObject projectile;
    public GameObject foot;
    public GameObject mouse;
    void Start()
    {


    }
    void Update()
        {        
            if (Input.GetMouseButtonDown(0))
            {
                Vector2 Target = Input.mousePosition;
                Vector2 pos1 = Camera.main.ScreenToWorldPoint(Target);
                GameObject newObj = (GameObject)GameObject.Instantiate(projectile);
                Vector2 pos2 = foot.transform.position;
                transform.position=Vector2.Lerp(pos2,pos1,Time.deltaTime);
            }

        }

3 个答案:

答案 0 :(得分:0)

为什么不使用Raycast。这很简单。这是一个例子(在翻译的方向和距离上移动对象(变换)。):

  var obj:Transform;
  var hit:RaycastHit;
  var move: boolean = false;
  var moveSpeed:float;
  var moveTime:float;
  private var startTime:float;

  function Update ()
  {
   if (Input.GetButtonDown ("Fire1"))
    {
      var ray = Camera.main.ScreenPointToRay (Input.mousePosition);


         if (Physics.Raycast (ray, hit, 10000)){
            move = true;
            startTime = Time.time;

           }
       }  

if(move){
    var curTime = Time.time;
    var elapsedTime = curTime - startTime;
    var amountToMove = elapsedTime / moveTime;
    print(amountToMove);
    obj.transform.position = Vector3.Lerp(obj.transform.position, hit.point, amountToMove);
    if(obj.transform.position == hit.point){
        move = false;
    }

此代码创建一个平面和一个立方体。将上述代码分配给平面,将多维数据集分配给检查器中的obj var。点击飞机,观看乐趣。

答案 1 :(得分:0)

这里有几个问题,我会一次解决一个问题。首先,移动射弹的代码连接错误:

transform.position=Vector2.Lerp(pos2,pos1,Time.deltaTime);

您正在移动附加“射击”的对象,而不是新游戏对象(newObj,因为您已将其命名。)

其次,了解更新模式以及如何正确使用它非常重要。每帧都会运行更新。 Time.deltaTime是最后一帧渲染与此渲染之间经过的时间。这个数字通常很小。最后,Input.GetMouseButtonDown仅在鼠标按下的第一帧时为true。

您尝试的当前代码(但由于其他代码问题而失败)将弹丸移动到单击鼠标的一帧。我们想要的是鼠标点击产生一个射弹,并且射弹可以向前推进每次更新。

最好用两个班级完成。我会称他们为Gun和SeekerBullet。每次按下鼠标按钮时,Gun类将负责创建一个项目符号。 SeekerBullet类将负责将子弹移动到它的目标。

<强>枪

public SeekerBullet ProjectilePrefab; 

void Update()
{
     if (Input.GetMouseButton(0))
     {
         Vector2 target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
         FireBullet(target);
     }
}

void FireBullet(Vector2 target)
{
    GameObject projectile = (GameObject)GameObject.Instantiate(ProjectilePrefab, transform.position, Quaternion.Identity);
    projectile.GetComponent<SeekerBullet>().Target = target;
}

<强> SeekerBullet

public float MoveSpeed = 5;    
public Vector2 Target { get; set; }

public void Update()
{
    transform.position = Vector3.MoveTowards(transform.position, Target, MoveSpeed * Time.deltaTime);

    if (transform.position == Target)
        OnReachTarget();
}

void OnReachTarget()
{
    // Do whatever you want here
    Destroy(gameObject); // delete this seekerbullet
}

我想强调的主要想法是隔离你的代码以便很好地执行它的一个功能。枪不应该负责移动射弹,只是创造它并告诉它去哪里。

另外,请注意,无论枪在哪里,射弹都会开始。见这一行

GameObject projectile = (GameObject)GameObject.Instantiate(ProjectilePrefab, transform.position, Quaternion.Identity);

transform.position是枪对象的位置。如果您希望它从脚开始,就像您在代码中一样,您可以像在示例中一样重新实现它。

答案 2 :(得分:0)

这很简单。您可以使用Vector3.Lerp函数来实现此目的。使用光线投射获取鼠标单击位置或触摸位置。然后使用lerp函数中的初始和最终位置。初始位置是游戏对象现在的位置,最终位置是点击/触摸位置。 你可以在这里找到The Game Contriver的文章

Move to Touch / Click Position - The Game Contriver

相关问题