【发布时间】:2021-07-21 09:04:06
【问题描述】:
所以,大家好,我是统一的新手。我有一个小小的疑问。我有一个玩家,他是一个放置在彼此身上的 3 stackcube 中的 topcube 的孩子。 一旦用户点击这些立方体,它们就有一个移动的目标位置。 就像想象我的世界有 3 个点。 POINT A 的位置坐标为 (0,0,1),POINT B 的位置坐标为 (0,0,2),POINT C 的位置坐标为 (0,0,3),3 个堆叠立方体放置在 (0,0,0) 上玩家小时候连接到那个 3stackcube 中的 topcube。 所有这些点(A,B,C)都有一个名为 targetpoint 的脚本,其中有一个变量 bool isFilled(默认为 false),当其中一个立方体到达其目标位置时,它变为 true。 进一步检查立方体何时到达它们的目标位置使 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;
}
}
【问题讨论】:
-
您能否更清楚地解释一下它是如何不工作的?即你的角色是完全没有移动还是移动了错误的量?
-
我的角色在移动,但移动量不正确@Giles Roberts。我认为这与我的 lerp 状况有关。无法弄清楚到底是什么\
-
为了了解更多,你希望你的角色从一个路径点跳到另一个路径点还是在它们之间平滑移动?