You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Driftology/Assets/Simple Car Controller/Scripts/SCC_CreateWheelCollider.cs

110 lines
4.1 KiB
C#

2 months ago
//----------------------------------------------
// Simple Car Controller
//
// Copyright © 2014 - 2023 BoneCracker Games
// http://www.bonecrackergames.com
//
//----------------------------------------------
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// Class was used for creating new WheelColliders on Editor.
/// </summary>
public class SCC_CreateWheelCollider {
// Method was used for creating new WheelColliders on Editor.
public static WheelCollider CreateWheelCollider(GameObject car, Transform wheel) {
// If we don't have any wheelmodels, throw an error.
if (!wheel) {
Debug.LogError("You haven't selected your Wheel Model. Please your Wheel Model before creating Wheel Colliders. Script needs to know their sizes and positions, aye?");
return null;
}
// Holding default rotation.
Quaternion currentRotation = car.transform.rotation;
// Resetting rotation.
car.transform.rotation = Quaternion.identity;
// Creating a new gameobject called Wheel Colliders for all Wheel Colliders, and parenting it to this gameobject.
GameObject wheelColliders;
if (!car.transform.Find("Wheel Colliders")) {
wheelColliders = new GameObject("Wheel Colliders");
wheelColliders.transform.SetParent(car.transform, false);
wheelColliders.transform.localRotation = Quaternion.identity;
wheelColliders.transform.localPosition = Vector3.zero;
wheelColliders.transform.localScale = Vector3.one;
} else {
wheelColliders = car.transform.Find("Wheel Colliders").gameObject;
}
GameObject wheelcollider = new GameObject(wheel.transform.name);
wheelcollider.transform.position = wheel.transform.position;
wheelcollider.transform.rotation = car.transform.rotation;
wheelcollider.transform.name = wheel.transform.name;
wheelcollider.transform.SetParent(wheelColliders.transform);
wheelcollider.transform.localScale = Vector3.one;
wheelcollider.AddComponent<WheelCollider>();
Bounds biggestBound = new Bounds();
Renderer[] renderers = wheel.GetComponentsInChildren<Renderer>();
foreach (Renderer render in renderers) {
if (render.bounds.size.z > biggestBound.size.z)
biggestBound = render.bounds;
}
wheelcollider.GetComponent<WheelCollider>().radius = (biggestBound.extents.y) / car.transform.localScale.y;
wheelcollider.AddComponent<SCC_Wheel>();
JointSpring spring = wheelcollider.GetComponent<WheelCollider>().suspensionSpring;
spring.spring = 35000f;
spring.damper = 1500f;
spring.targetPosition = .5f;
wheelcollider.GetComponent<WheelCollider>().suspensionSpring = spring;
wheelcollider.GetComponent<WheelCollider>().suspensionDistance = .2f;
wheelcollider.GetComponent<WheelCollider>().forceAppPointDistance = .1f;
wheelcollider.GetComponent<WheelCollider>().mass = 40f;
wheelcollider.GetComponent<WheelCollider>().wheelDampingRate = 1f;
WheelFrictionCurve sidewaysFriction;
WheelFrictionCurve forwardFriction;
sidewaysFriction = wheelcollider.GetComponent<WheelCollider>().sidewaysFriction;
forwardFriction = wheelcollider.GetComponent<WheelCollider>().forwardFriction;
forwardFriction.extremumSlip = .3f;
forwardFriction.extremumValue = 1;
forwardFriction.asymptoteSlip = 1f;
forwardFriction.asymptoteValue = 1f;
forwardFriction.stiffness = 1.5f;
sidewaysFriction.extremumSlip = .3f;
sidewaysFriction.extremumValue = 1;
sidewaysFriction.asymptoteSlip = 1f;
sidewaysFriction.asymptoteValue = 1f;
sidewaysFriction.stiffness = 1.5f;
wheelcollider.GetComponent<WheelCollider>().sidewaysFriction = sidewaysFriction;
wheelcollider.GetComponent<WheelCollider>().forwardFriction = forwardFriction;
car.transform.rotation = currentRotation;
return wheelcollider.GetComponent<WheelCollider>();
}
}