Tôi đang viết nền tảng 2D trong Unity và tôi đang cố gắng để người chơi tiếp tục sử dụng nền tảng di chuyển. Tôi đã tìm kiếm và nhắn tin cho một hoặc hai ngày, và tôi không có may mắn.Ở trên các nền tảng di chuyển
Về cơ bản, tôi đã được yêu cầu cố giữ cho nhân vật di chuyển với nền tảng khi họ chạm vào. Thứ nhất, nếu tôi sử dụng bất cứ điều gì liên quan đến OnTriggerEnter(), người chơi sẽ đi qua nền tảng này. Nếu tôi làm OnCollisionEnter() (với một CharacterController trên máy nghe nhạc và một BoxCollider trên nền tảng), không có gì xảy ra cả. Đây là hai điều tôi đã tìm thấy nhiều nhất. Người kia là nuôi dạy con người chơi với nền tảng, nhưng điều này dường như gây ra "vấn đề" (thường xuyên nói, không bao giờ giải thích).
Vì vậy, làm cách nào để người chơi có thể ở lại trên nền tảng di chuyển? Đây là mã cho nền tảng di chuyển:
public class MovingPlatform : MonoBehaviour
{
private float useSpeed;
public float directionSpeed = 9.0f;
float origY;
public float distance = 10.0f;
// Use this for initialization
void Start()
{
origY = transform.position.y;
useSpeed = -directionSpeed;
}
// Update is called once per frame
void Update()
{
if(origY - transform.position.y > distance)
{
useSpeed = directionSpeed; //flip direction
}
else if(origY - transform.position.y < -distance)
{
useSpeed = -directionSpeed; //flip direction
}
transform.Translate(0,useSpeed*Time.deltaTime,0);
}
VÀ đây là mã cho phong trào của Player (trong Cập nhật):
CharacterController controller = GetComponent<CharacterController>();
float rotation = Input.GetAxis("Horizontal");
if(controller.isGrounded)
{
moveDirection.Set(rotation, 0, 0); //moveDirection = new Vector3(rotation, 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
//running code
if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) //check if shift is held
{ running = true; }
else
{ running = false; }
moveDirection *= running ? runningSpeed : walkingSpeed; //set speed
//jump code
if(Input.GetButtonDown("Jump"))
{
//moveDirection.y = jumpHeight;
jump();
}
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
EDIT: Tôi nghĩ rằng nó có thể có để làm với cách tôi m xác định trình phát và nền tảng, nhưng tôi đã thử các kết hợp khác nhau. Nếu nền tảng là một kích hoạt (trên máy va chạm của nó), thì người chơi sẽ xuyên suốt nó. Nếu không, tôi không thể sử dụng chức năng OnTrigger. Tôi có một người cứng nhắc gắn liền với cả người chơi và nền tảng, nhưng nó dường như không ảnh hưởng gì cả. Khi người chơi KHÔNG nhận được trên nền tảng trong một số thiết lập, anh ta jitters và thường chỉ kết thúc lên qua.
Tôi chưa bao giờ sử dụng Unity3D, nhưng là nó có thể làm điều gì đó như 'moveDirection + = thePlatform.moveDirection' khi ký tự nằm trên một nền tảng? – mbeckish
Tôi đã thử điều đó, nhưng dường như tôi gặp sự cố với các chức năng của OnTrigger và OnCollision, điều này sẽ chịu trách nhiệm về phần "khi người chơi ở trên nền tảng". Tôi nghĩ rằng nó đã làm với cách tôi đang xác định các đối tượng của tôi, nhưng tôi không chắc chắn về cách thích hợp để xác định chúng như vậy mà điều này có thể làm việc. – muttley91
Ngoài ra, bạn sẽ cần phải đảm bảo rằng moveDirection.y của ký tự không bao giờ nhỏ hơn moveDirection.y của nền tảng của bạn, nếu không bạn sẽ rơi qua (trừ khi khung Unity3D xử lý cho bạn một cách tự động?) – mbeckish