我在这里有这个代码,我试图在鼠标点击时将一个对象从一个位置移动到另一个位置,但是每次我运行它只是将弹丸对象在特定位置实例化,而它必须在一个特定位置实例化它对象位置
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);
}
}
答案 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的文章