我们正在做一个简单的2D平台游戏,上楼梯._遇到困难。底线是角色必须爬上梯子才能站立在梯子上,并通过按下向下箭头下降。为此,我们在平台与梯子最高点接触的平台上使用PlatformEffector2D,并编写了一个脚本,当角色接触平台本身的对撞机时,脚本应更改rotationalOffset,具体取决于当前值(0或0)。 180)和夹紧键(向上或向下)。这是代码:
private void OnCollisionStay2D(Collision2D col)
{
if (col.gameObject.name == "platform_ladder")
{
PlatformEffector2D pe =
col.gameObject.GetComponent<PlatformEffector2D>();
if (Input.GetKeyDown(KeyCode.DownArrow) && pe.rotationalOffset ==
0)
{
pe.rotationalOffset = 180;
}
else if (Input.GetKeyDown(KeyCode.UpArrow) && pe.rotationalOffset
== 180)
{
pe.rotationalOffset = 0;
}
}
}
结果,角色爬上楼梯,站立在楼梯上,但对按下按键没有反应。如果您退后一步来赚钱,那么脚本将起作用,并且轮换偏移也会发生变化。但是,不可能站在平台上,角色只是从那里爬过去。我举了一个从屏幕上录制的示例(不幸的是,它减慢了视频的速度,但是我在视频上写的内容是可见的)
https://drive.google.com/file/d/1ccUi0sqtVxFS1UAKE7QaQKvr3x4-7S8o
无论如何,我都会给出爬楼梯的代码;突然有一个错误:
/* CLimbing */
raydistance = 0;
RaycastHit2D hitinfo = Physics2D.Raycast(transform.position, Vector2.up, raydistance, whatisLadder);
if (hitinfo.collider != null)
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
isClimbing = true;
}
else if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.LeftArrow))
{
isClimbing = false;
}
}
else
{
isClimbing = false;
}
anim.SetBool("OnLadder", isClimbing);
if (isClimbing && hitinfo.collider != null)
{
rb.velocity = new Vector2(rb.position.x, Input.GetAxisRaw("Vertical") * speed);
// rb.gravityScale = 0;
rb.isKinematic = true;
anim.SetBool("Ground", true);
else
{
rb.isKinematic = false;
// rb.gravityScale = 3;
}
我们不要求编写解决方案代码,但请您向我们解释该原理并向正确的方向发送它,谢谢^^
答案 0 :(得分:0)
也许在角色和梯子游戏对象上添加触发对撞机,并在按住并触发时增加玩家的y位置?
private Rigidbody rb;
[SerializeField]
private float ClimbingSpeed;
void Start(){
rb = GetComponent<Rigidbody>();
}
Public void OnTriggerStay(Collider collider){
if(collider.gameobject.tag == "Ladder" && input.GetKey(KeyCode.W)){
rb.moveposition(
transform.position.x,
transform.position.y + 1 * Time.DeltaTime * ClimbingSpeed,
transform.position.z
{
{