[英]Move Character from point A to B smoothly unity
所以,嘿伙计们,我是 unity 的新手。 我有一个小疑问。 我有一个玩家,他是一个放置在彼此之上的 3 stackcube 中的 topcube 的孩子。 一旦用户点击这些立方体,它们就会有一个移动的目标位置。 就像想象在我的世界里有 3 个点。 点 A 的位置坐标为(0,0,1),点 B 为(0,0,2),点 C 为(0,0,3)并且 3 个堆栈立方体位于(0,0,0)上将玩家作为孩子连接到该 3stackcube 中的 topcube。 所有这些点(A,B,C)都有一个名为 targetpoint 的脚本,其中有一个变量 bool isFilled(默认为 false),当其中一个立方体到达其目标位置时,该脚本变为真。 进一步即时检查每当立方体到达其目标位置时使 isFilled 为真,并检查是否有附加的孩子,如果是,则获取孩子的动画师并触发跳跃动画。 跳跃动画是一个就地动画。 所以我想以编程方式将我的角色 +1 朝他所面对的方向移动(如果他面向 z 移动 + 1 在 z 中,如果 x 像这样在 x 中移动 +1)当他所连接的立方体到达其目标位置时,同时也播放跳跃动画。 我做了一个代码。 它似乎没有工作。 很抱歉有很大的段落。 我对编码和提出疑问完全陌生。 任何帮助都会有所帮助,谢谢。
[SerializeField] public List<targetpoint> waypoints;
[SerializeField] float moveSpeed = 2f;
[SerializeField] AudioClip[] surferSounds;
[SerializeField] GameObject particleToPlay;
int waypointIndex = 0;
float t;
//Cached Reference
AudioSource audioSource;
//State
public bool move = false;
void Start()
{
transform.position = this.transform.position;
t = 0f;
}
void FixedUpdate()
{
if (move == true)
{
MoveTarget();
}
}
void MoveTarget()
{
//Time.timeScale = 0.1f;
if (waypointIndex <= waypoints.Count - 1)
{
var targetPosition = waypoints[waypointIndex].transform.position;
transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
if (transform.position == targetPosition)
{
//Debug.Log(t);
if (waypoints[waypointIndex].isFilled == false)
{
waypoints[waypointIndex].isFilled = true;
AudioClip clip = surferSounds[UnityEngine.Random.Range(0, surferSounds.Length)];
var storeToDestroy = Instantiate(particleToPlay, targetPosition, Quaternion.identity);
Destroy(storeToDestroy , 5f);
audioSource.PlayOneShot(clip);
move = false;
}
else if(waypoints[waypointIndex].isFilled == true)
{
waypointIndex++;
targetPosition = waypoints[waypointIndex].transform.position;
transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSpeed * Time.deltaTime);
}
if (this.gameObject.transform.childCount > 0)
{
var storeChild = gameObject.transform.GetChild(1).gameObject;
StartCoroutine(GravityAndJump(storeChild,storeChild.transform.position+1*transform.forward,1f));
}
else
{
return;
}
}
}
}
IEnumerator GravityAndJump(GameObject child, Vector3 newPosition , float time)
{
var elapsedTime = 0f;
var startingPosition = child.transform.position;
while(elapsedTime < time)
{
child.GetComponent<Animator>().SetTrigger("shouldJump?");
child.transform.position = Vector3.Lerp(startingPosition, newPosition, (elapsedTime / time));
elapsedTime += Time.deltaTime;
yield return null;
}
//storeChild.GetComponent<Animator>().SetFloat("JumpSpeed", 1f);
//yield return new WaitForSeconds(1f);
//gameObject.GetComponentInChildren<Rigidbody>().useGravity = true;
}
}
所以我想以编程方式将我的角色 +1 移向他所面对的方向(如果他面向 z 移动 + 1 在 z 中,如果 x 像这样在 x 中移动 +1)
您可以使用transform.forward获取 GameObject 的前向方向,您可以使用它来计算 GameObject 前面的目标位置。
在变换前一定距离设置目标位置
targetPosition = transform.position + (transform.forward * distance);
以一定速度向目标位置移动。
transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * followSpeed);
确定到达 targetPosition
在确定变换是否已到达目标目的地时,您应该测量距离而不是比较向量是否相同。
所以替换这个:
if (transform.position == targetPosition){}
像这样:
if(Vector3.Distance(transform.position, targetPosition) < .001f){
transform.position = targetPosition;
}
除非您将两个向量严格设置为相同的值,否则由于浮点数的工作方式,它们很可能永远不会被视为相等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.