Advertisement
Aranyalma2

Unity_3D_char_swimming

Aug 29th, 2018
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.80 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityStandardAssets.Characters.FirstPerson;
  4. using System;
  5. using System.Reflection;
  6. using Assets.SwimmingSystem.Scripts;
  7. using UnityEngine.PostProcessing;
  8.  
  9. namespace Assets.SwimmingSystem.Scripts
  10. {
  11.  
  12.     public class Swim : MonoBehaviour
  13.     {
  14.  
  15.         private FirstPersonController _firstPersonController;
  16.  
  17.         private CharacterController _characterController;
  18.  
  19.          // Default settings on start
  20.         private float _defWalkspeed, _defJumpspeed, _defRunspeed, _defGravityMultiplier;
  21.  
  22.         private FogMode _defFogMode;
  23.  
  24.         private float _defFogDensity;
  25.  
  26.         private Color _defFogColor;
  27.  
  28.         private bool _defFogEnabled;
  29.  
  30.         private Camera _camera;
  31.  
  32.         private bool _isInWater = false;
  33.  
  34.         private float _waterSurfacePosY = 0.0f;
  35.  
  36.         public float _aboveWaterTolerance = 0.5f;
  37.  
  38.         [Range(0.5f, 3.0f)]
  39.         public float _upDownSpeed = 1.0f;
  40.  
  41.         public Color FogColorWater;
  42.  
  43.         public PostProcessingProfile PPP_Land;
  44.  
  45.         public PostProcessingProfile PPP_Underwater;
  46.  
  47.         // Use this for initialization
  48.         void Start()
  49.         {
  50.             _firstPersonController = GetComponent<FirstPersonController>();
  51.  
  52.             _characterController = GetComponent<CharacterController>();
  53.          
  54.  
  55.             Transform fpChar = transform.Find("FirstPersonCharacter");
  56.  
  57.             _camera = fpChar.GetComponent<Camera>();
  58.  
  59.             // Default values for FirstPersonController on start
  60.             _defWalkspeed = WalkSpeed;
  61.             _defRunspeed = RunSpeed;
  62.             _defJumpspeed = JumpSpeed;
  63.             _defGravityMultiplier = GravityMultiplier;
  64.  
  65.             _defFogMode = RenderSettings.fogMode;
  66.             _defFogDensity = RenderSettings.fogDensity;
  67.             _defFogColor = RenderSettings.fogColor;
  68.             _defFogEnabled = RenderSettings.fog;
  69.  
  70.         }
  71.  
  72.         // Update is called once per frame
  73.         void Update()
  74.         {
  75.             // Set underwater rendering or default
  76.             if (IsUnderwater())
  77.             {
  78.                 SetRenderDiving();
  79.             }
  80.             else
  81.             {
  82.                 SetRenderDefault();
  83.             }
  84.  
  85.             // Handle swimming
  86.  
  87.             // 1. If camera underwater we dive
  88.             if (_isInWater)
  89.             {
  90.                 if (IsUnderwater())
  91.                 {
  92.                     DoDiving();
  93.                 }
  94.                 else
  95.                 {
  96.                     // we are grounded and not underwater, we might walk as well
  97.                     if (_characterController.isGrounded)
  98.                     {
  99.                         DoWalking();
  100.                     }
  101.                     else
  102.                     {
  103.                         // we are not grounded so we are swimming above the surface
  104.                         HandleUpDownSwimMovement();
  105.  
  106.                     }
  107.                 }
  108.             }
  109.             else
  110.             {
  111.                 DoWalking();
  112.             }
  113.         }
  114.  
  115.         // Check if we are underwater
  116.         private bool IsUnderwater()
  117.         {
  118.             return _camera.gameObject.transform.position.y < (_waterSurfacePosY);
  119.         }
  120.  
  121.         // Let's walk
  122.         private void DoWalking()
  123.         {
  124.             StickToGroundForce = 10;
  125.             WalkSpeed = Mathf.Lerp(WalkSpeed, _defWalkspeed, Time.deltaTime * 3.0f);
  126.             RunSpeed = Mathf.Lerp(RunSpeed, _defRunspeed, Time.deltaTime * 3.0f);
  127.             JumpSpeed = _defJumpspeed;
  128.             GravityMultiplier = _defGravityMultiplier;
  129.             UserHeadBob = true;
  130.         }
  131.  
  132.         // Let's dive
  133.         private void DoDiving()
  134.         {
  135.             WalkSpeed = 1.0f;
  136.             RunSpeed = 2.0f;
  137.             JumpSpeed = 0.0f;
  138.  
  139.             UserHeadBob = false;
  140.  
  141.             HandleUpDownSwimMovement();
  142.    
  143.         }
  144.  
  145.         private void HandleUpDownSwimMovement()
  146.         {
  147.             StickToGroundForce = 0.0f;
  148.  
  149.             GravityMultiplier = 0.1f;
  150.  
  151.             Vector3 mv = MoveDir;
  152.  
  153.             if (Input.GetKey(KeyCode.E))
  154.             {
  155.                 // go upwards
  156.                 if (_camera.gameObject.transform.position.y < _waterSurfacePosY + _aboveWaterTolerance)
  157.                 {
  158.                     mv.y = _upDownSpeed;
  159.                 }
  160.  
  161.             }
  162.             else if (Input.GetKey(KeyCode.Q))
  163.             {
  164.                 // go down
  165.                 mv.y = -_upDownSpeed;
  166.             }
  167.  
  168.             MoveDir = mv;
  169.         }
  170.  
  171.         // Rendering when diving
  172.         private void SetRenderDiving()
  173.         {
  174.             RenderSettings.fog = true;
  175.             RenderSettings.fogColor = FogColorWater;
  176.             RenderSettings.fogDensity = 0.1f;
  177.             RenderSettings.fogMode = FogMode.Exponential;
  178.  
  179.             _camera.GetComponent<PostProcessingBehaviour>().profile = PPP_Underwater;
  180.         }
  181.  
  182.         // Rendering when above water
  183.         private void SetRenderDefault()
  184.         {
  185.             RenderSettings.fogColor = _defFogColor;
  186.             RenderSettings.fogDensity = _defFogDensity;
  187.             RenderSettings.fog = _defFogEnabled;
  188.             RenderSettings.fogMode = _defFogMode;
  189.  
  190.             _camera.GetComponent<PostProcessingBehaviour>().profile = PPP_Land;
  191.         }
  192.  
  193.  
  194.         public void OnTriggerEnter(Collider other)
  195.         {
  196.             if (LayerMask.LayerToName(other.gameObject.layer) == "Water")
  197.             {
  198.                 // We enter the water... doesn't matter if we return from underwater, we are still in the water
  199.                 _isInWater = true;
  200.  
  201.                 Debug.Log("Water Trigger Enter : " + _isInWater);
  202.             }
  203.         }
  204.  
  205.         public void OnTriggerExit(Collider other)
  206.         {
  207.             if (LayerMask.LayerToName(other.gameObject.layer) == "Water" && _isInWater)
  208.             {
  209.  
  210.                 // we are leaving the water, or are we under the sureface?
  211.                 _waterSurfacePosY = other.transform.position.y;
  212.                 float fpsPosY = this.transform.position.y;
  213.                 if (fpsPosY > _waterSurfacePosY)
  214.                 {
  215.                     // ok we really left the water
  216.                     _isInWater = false;
  217.                 }
  218.  
  219.                 Debug.Log("Water Trigger Exit : " + _isInWater);
  220.             }
  221.         }
  222.        
  223.         #region Properties by reflection
  224.  
  225.         private Vector3 MoveDir
  226.         {
  227.             get
  228.             {
  229.                 return (Vector3)ReflectionUtil.GetFieldValue(_firstPersonController, "m_MoveDir");
  230.             }
  231.             set
  232.             {
  233.                 ReflectionUtil.SetFieldValue(_firstPersonController, "m_MoveDir", value);
  234.             }
  235.         }
  236.  
  237.  
  238.         public float WalkSpeed
  239.         {
  240.             get
  241.             {
  242.                 return (float)ReflectionUtil.GetFieldValue(_firstPersonController, "m_WalkSpeed");
  243.             }
  244.             set
  245.             {
  246.                 ReflectionUtil.SetFieldValue(_firstPersonController, "m_WalkSpeed", value);
  247.             }
  248.         }
  249.  
  250.         public float RunSpeed
  251.         {
  252.             get
  253.             {
  254.                 return (float)ReflectionUtil.GetFieldValue(_firstPersonController, "m_RunSpeed");
  255.             }
  256.             set
  257.             {
  258.                 ReflectionUtil.SetFieldValue(_firstPersonController, "m_RunSpeed", value);
  259.             }
  260.         }
  261.  
  262.         public float JumpSpeed
  263.         {
  264.             get
  265.             {
  266.                 return (float)ReflectionUtil.GetFieldValue(_firstPersonController, "m_JumpSpeed");
  267.             }
  268.             set
  269.             {
  270.                 ReflectionUtil.SetFieldValue(_firstPersonController, "m_JumpSpeed", value);
  271.             }
  272.         }
  273.  
  274.         public float GravityMultiplier
  275.         {
  276.             get
  277.             {
  278.                 return (float)ReflectionUtil.GetFieldValue(_firstPersonController, "m_GravityMultiplier");
  279.             }
  280.             set
  281.             {
  282.                 ReflectionUtil.SetFieldValue(_firstPersonController, "m_GravityMultiplier", value);
  283.             }
  284.         }
  285.  
  286.         public float StickToGroundForce
  287.         {
  288.             get
  289.             {
  290.                 return (float)ReflectionUtil.GetFieldValue(_firstPersonController, "m_StickToGroundForce");
  291.             }
  292.             set
  293.             {
  294.                 ReflectionUtil.SetFieldValue(_firstPersonController, "m_StickToGroundForce", value);
  295.             }
  296.         }
  297.  
  298.        
  299.         public bool UserHeadBob
  300.         {
  301.             get
  302.             {
  303.                 return (bool)ReflectionUtil.GetFieldValue(_firstPersonController, "m_UseHeadBob");
  304.             }
  305.             set
  306.             {
  307.                 ReflectionUtil.SetFieldValue(_firstPersonController, "m_UseHeadBob", value);
  308.             }
  309.         }
  310.  
  311.         #endregion
  312.  
  313.  
  314.     }
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement