C# 创建一个旧学校地牢爬虫的运动

C# 创建一个旧学校地牢爬虫的运动,c#,unity3d,C#,Unity3d,我在让playercontroller脚本识别标记“Wall”时遇到一些问题。我希望对撞机撞到墙上,然后以刚性运动反弹回来,甚至一开始就不撞到墙上 这就是我所拥有的 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { Vector3 pos;

我在让playercontroller脚本识别标记“Wall”时遇到一些问题。我希望对撞机撞到墙上,然后以刚性运动反弹回来,甚至一开始就不撞到墙上

这就是我所拥有的

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{

  Vector3 pos;                                // For movement
  public float speed = 7.0f;                         // Speed of movement
  public float movementRange = 2.0f;
  public Transform relativeTransform;

  IEnumerator RotateMe(Vector3 byAngles, float inTime)
  {
    var fromAngle = transform.rotation;
    var toAngle = Quaternion.Euler(transform.eulerAngles + byAngles);
    for (var t = 0f; t < 1; t += Time.deltaTime / inTime)
    {
      transform.rotation = Quaternion.Slerp(fromAngle, toAngle, t);
      yield return null;
    }
  }

 

  void OnCollisionEnter(Collision collision)
  
  {
    if(gameObject.CompareTag("Wall"))
    {
      GetComponent<Rigidbody>().position += -relativeTransform.forward * (movementRange);
      Debug.Log("You hit a wall!");
    }  
  }


  void Start()
  {
    pos = transform.position;          // Take the initial position
  }

  void FixedUpdate()
  {
    if (Input.GetKeyDown(KeyCode.A) && transform.position == pos)
    {        // Left
      pos += -relativeTransform.right * (movementRange);
    }
    if (Input.GetKeyDown(KeyCode.D) && transform.position == pos)
    {        // Right
      pos += relativeTransform.right * (movementRange);
    }
    if (Input.GetKeyDown(KeyCode.W) && transform.position == pos)
    {        // Up
      pos += relativeTransform.forward * (movementRange);
    }
    if (Input.GetKeyDown(KeyCode.S) && transform.position == pos)
    {        // Down
      pos += -relativeTransform.forward * (movementRange);

    }
    if (Input.GetKeyDown(KeyCode.Q) && transform.position == pos)
    {
      StartCoroutine(RotateMe(Vector3.up * -90, 0.8f));
    } //Rotate Left

    if (Input.GetKeyDown(KeyCode.E) && transform.position == pos)
    {
      StartCoroutine(RotateMe(Vector3.up * 90, 0.8f));
    } //Rotate Right

    transform.position = Vector3.MoveTowards(transform.position, pos, Time.deltaTime * speed);    // Move there
  }

}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类玩家控制器:单行为
{
矢量3位置;//用于移动
公共浮动速度=7.0f;//移动速度
公共浮动范围=2.0f;
公共变换相对变换;
IEnumerator RotateMe(矢量3倍角,浮动时间)
{
var fromAngle=transform.rotation;
var toAngle=四元数.Euler(transform.eulerAngles+byAngles);
对于(变量t=0f;t<1;t+=Time.deltaTime/inTime)
{
transform.rotation=Quaternion.Slerp(从角度,到角度,t);
收益返回空;
}
}
无效碰撞中心(碰撞)
{
if(gameObject.CompareTag(“墙”))
{
GetComponent().position+=-relativeTransform.forward*(移动范围);
Log(“你撞到墙了!”);
}  
}
void Start()
{
pos=transform.position;//取初始位置
}
void FixedUpdate()
{
if(Input.GetKeyDown(KeyCode.A)和&transform.position==pos)
{//左
pos+=-relativeTransform.right*(移动范围);
}
if(Input.GetKeyDown(KeyCode.D)和&transform.position==pos)
{//对
pos+=relativeTransform.right*(移动范围);
}
if(Input.GetKeyDown(KeyCode.W)和&transform.position==pos)
{//Up
pos+=相对变换向前*(移动范围);
}
if(Input.GetKeyDown(KeyCode.S)和&transform.position==pos)
{//Down
pos+=-relativeTransform.forward*(移动范围);
}
if(Input.GetKeyDown(KeyCode.Q)和&transform.position==pos)
{
开始例行程序(旋转体(矢量3.up*-90,0.8f));
}//向左旋转
if(Input.GetKeyDown(KeyCode.E)和&transform.position==pos)
{
start例程(RotateMe(矢量3.up*90,0.8f));
}//向右旋转
transform.position=Vector3.movetoward(transform.position,pos,Time.deltaTime*速度);//移动到那里
}
}
我将playercontroller脚本连接到主摄像机上,带有刚体和胶囊碰撞器。我现在不知所措。任何帮助都会很棒

脚本未识别墙标记,也未将消息发送到调试日志

干杯

橡皮鸭帮了忙

我需要添加collision.gameobject来修复碰撞

void OnCollisionEnter(Collision collision)
  
  {
    if(collision.gameObject.CompareTag("Wall"))
    {
      pos += -relativeTransform.forward * (movementRange);
      Debug.Log("You hit a wall!");
    }  
  }