脚本挂载在车子上车子需要具有Rigidbody2D组件
其中子物体:
wheelFront:车子前轮,有CircleCollider,WheelJoint2D和Rigidbody2D组件
wheelBack:车子后轮,有CircleCollider,WheelJoint2D和Rigidbody2D组件
wheelFrontTrigger车子前轮下方的检测器,需要勾选Trigger的CircleCollider和属性为Kinematic的Rigidbody2D组件,以及一个简单的GetWheelTrigger脚本(文章末尾)
wheelBackTrigger车子后轮下方的检测器,需要勾选Trigger的CircleCollider和属性为Kinematic的Rigidbody2D组件,以及一个简单的GetWheelTrigger脚本(文章末尾)
文中用到的GameManager在这篇文章:Unity学习笔记:在GameManager里记录手游操作框架_努力长头发的程序猿的博客-CSDN博客
using UnityEngine;
using Transform = UnityEngine.Transform;
public class CarController : MonoBehaviour
{
public Transform mainCar { get; set; }
private WheelJoint2D wheelFront, wheelBack;
private Rigidbody2D wheelFrontRig, wheelBackRig;
private Rigidbody2D mainRig;
private float speed;
private float speedMax = 750.0f;
private float speedUp;
private float holdSpeed = 100.0f;
private JointMotor2D frontMotor = new JointMotor2D();
private JointMotor2D backMotor = new JointMotor2D();
private bool stopSpeed;
private void Awake()
{
mainCar = transform;
mainCar.gameObject.SetActive(true);
wheelFront = mainCar.Find("Wheel/front").GetComponent<WheelJoint2D>();
wheelBack = mainCar.Find("Wheel/back").GetComponent<WheelJoint2D>();
wheelFrontRig = wheelFront.GetComponent<Rigidbody2D>();
wheelBackRig = wheelBack.GetComponent<Rigidbody2D>();
mainRig = mainCar.GetComponent<Rigidbody2D>();
}
void Update()
{
if (GameManager.Main.ClickLeftScreen())
{
speed = -speedMax + speedUp;
SetWheelRig(true);
stopSpeed = false;
}
else if (GameManager.Main.ClickRightScreen())
{
speed = speedMax + speedUp;
SetWheelRig(true);
stopSpeed = false;
}
else
{
speed = 0;
SetWheelRig(false);
stopSpeed = true;
}
}
private void FixedUpdate()
{
if(speedUp > 0){ speedUp -= 1; }
if (stopSpeed)
{
wheelFront.useMotor = false;
wheelBack.useMotor = false;
return;
}
frontMotor.motorSpeed = speed;
backMotor.motorSpeed = speed;
frontMotor.maxMotorTorque = speedMax + speedUp;
backMotor.maxMotorTorque = speedMax + speedUp;
wheelFront.motor = frontMotor;
wheelBack.motor = backMotor;
}
void SetWheelRig(bool fast)
{
if (fast)
{
wheelFrontRig.angularDrag = 0;
wheelBackRig.angularDrag = 0;
}
else
{
wheelFrontRig.angularDrag = holdSpeed;
wheelBackRig.angularDrag = holdSpeed;
}
}
public void Jump(float power)
{
mainRig.AddForce(Vector2.up * power);
}
public void SpeedUp(float power,float speed)
{
mainRig.AddForce(transform.right * power);
speedUp = speed;
}
}
其中涉及到的GetWheelTrigger代码为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GetWheelTrigger : MonoBehaviour
{
private Coroutine coroutine;
public bool isInTrigger;
private void OnTriggerStay2D(Collider2D other)
{
isInTrigger = true;
if(coroutine!=null){StopCoroutine(coroutine);}
coroutine = StartCoroutine(CloseTrigger());
}
IEnumerator CloseTrigger()
{
yield return new WaitForSeconds(0.5f);
isInTrigger = false;
}
}