コード例 #1
0
        public override void OnInspectorGUI()
        {
            GroundSurfaceMaster surfaceMaster = FindObjectOfType <GroundSurfaceMaster>();

            targetScript = (TerrainSurface)target;
            Undo.RecordObject(targetScript, "Terrain Surface Change");

            if (targetScript.GetComponent <Terrain>().terrainData)
            {
                terDat = targetScript.GetComponent <Terrain>().terrainData;
            }

            EditorGUILayout.LabelField("Textures and Surface Types:", EditorStyles.boldLabel);

            surfaceNames = new string[surfaceMaster.surfaceTypes.Length];

            for (int i = 0; i < surfaceNames.Length; i++)
            {
                surfaceNames[i] = surfaceMaster.surfaceTypes[i].name;
            }

            if (targetScript.surfaceTypes.Length > 0)
            {
                for (int j = 0; j < targetScript.surfaceTypes.Length; j++)
                {
                    DrawTerrainInfo(terDat, j);
                }
            }
            else
            {
                EditorGUI.indentLevel++;
                EditorGUILayout.LabelField("<No terrain textures found>");
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(targetScript);
            }
        }
コード例 #2
0
        void GetWheelContact()
        {
            float castDist = Mathf.Max(suspensionParent.suspensionDistance * Mathf.Max(0.001f, suspensionParent.targetCompression) + actualRadius, 0.001f);

            RaycastHit[] wheelHits = Physics.RaycastAll(suspensionParent.maxCompressPoint, suspensionParent.springDirection, castDist, GlobalControl.wheelCastMaskStatic);
            RaycastHit   hit;
            int          hitIndex = 0;
            bool         validHit = false;
            float        hitDist  = Mathf.Infinity;

            if (connected)
            {
                //Loop through raycast hits to find closest one
                for (int i = 0; i < wheelHits.Length; i++)
                {
                    if (!wheelHits[i].transform.IsChildOf(vp.tr) && wheelHits[i].distance < hitDist)
                    {
                        hitIndex = i;
                        hitDist  = wheelHits[i].distance;
                        validHit = true;
                    }
                }
            }
            else
            {
                validHit = false;
            }

            //Set contact point variables
            if (validHit)
            {
                hit = wheelHits[hitIndex];

                if (!grounded && impactSnd && ((tireHitClips.Length > 0 && !popped) || (rimHitClip && popped)))
                {
                    impactSnd.PlayOneShot(popped ? rimHitClip : tireHitClips[Mathf.RoundToInt(Random.Range(0, tireHitClips.Length - 1))], Mathf.Clamp01(airTime * airTime));
                    impactSnd.pitch = Mathf.Clamp(airTime * 0.2f + 0.8f, 0.8f, 1);
                }

                grounded = true;
                contactPoint.distance         = hit.distance - actualRadius;
                contactPoint.point            = hit.point + localVel * Time.fixedDeltaTime;
                contactPoint.grounded         = true;
                contactPoint.normal           = hit.normal;
                contactPoint.relativeVelocity = tr.InverseTransformDirection(localVel);
                contactPoint.col = hit.collider;

                if (hit.collider.attachedRigidbody)
                {
                    contactVelocity = hit.collider.attachedRigidbody.GetPointVelocity(contactPoint.point);
                    contactPoint.relativeVelocity -= tr.InverseTransformDirection(contactVelocity);
                }
                else
                {
                    contactVelocity = Vector3.zero;
                }

                GroundSurfaceInstance curSurface = hit.collider.GetComponent <GroundSurfaceInstance>();
                TerrainSurface        curTerrain = hit.collider.GetComponent <TerrainSurface>();

                if (curSurface)
                {
                    contactPoint.surfaceFriction = curSurface.friction;
                    contactPoint.surfaceType     = curSurface.surfaceType;
                }
                else if (curTerrain)
                {
                    contactPoint.surfaceType     = curTerrain.GetDominantSurfaceTypeAtPoint(contactPoint.point);
                    contactPoint.surfaceFriction = curTerrain.GetFriction(contactPoint.surfaceType);
                }
                else
                {
                    contactPoint.surfaceFriction = hit.collider.material.dynamicFriction * 2;
                    contactPoint.surfaceType     = 0;
                }

                if (contactPoint.col.CompareTag("Pop Tire") && canPop && airLeakTime == -1 && !popped)
                {
                    Deflate();
                }
            }
            else
            {
                grounded = false;
                contactPoint.distance         = suspensionParent.suspensionDistance;
                contactPoint.point            = Vector3.zero;
                contactPoint.grounded         = false;
                contactPoint.normal           = upDir;
                contactPoint.relativeVelocity = Vector3.zero;
                contactPoint.col             = null;
                contactVelocity              = Vector3.zero;
                contactPoint.surfaceFriction = 0;
                contactPoint.surfaceType     = 0;
            }
        }