unity3d]鼠标点击地面人物自动走动(也包含按键wasdspace控制)


目录(?)[-]

  1. 一效果图
  2. 二大概步骤
    1. 创建一个plane设置层为Terrain因为后面要判断是否点击的是这个层
    2. 准备好人物模型并且将三个脚本拖放到人物上并且将动画文件也拖放好记得看前面提醒哦
      1. ThirdPersonCamera相当于smoothflow
      2. ThirdPersonController修改版
      3. mouseMoveContr鼠标点击人物走动

在漫游游戏中常用的功能就是人物在场景中行走,必要的功能就是鼠标点击地面人物就朝着那个方向行走,键盘方向键前后左右也能控制人物的行走和跳跃,在官方自带的第三人称视角中做了一点修改,官方自带的ThirdPersonController中的摄像机自动指向人物的背面,这样不能看到人物的正面或者侧面,对ThirdPersonController脚本做了修改之后,可以旋转摄像机的视角,可以摄像机跟随,类似smoothfollow的功能。

值得注意提醒的一个,就是动画系统,选择老版本的动画系统,不然会提示找不到模型,因为脚本中用的是老版本的动画系统的代码。

一、效果图



1.鼠标点击地面人物朝着点击的点前进
2.按住wasd和space键也能控制人物的动作

二、大概步骤

1.创建一个plane,设置层为Terrain,因为后面要判断是否点击的是这个层

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. void Update () {  
  2.         MouseDownMover();  
  3.     }  
  4.   
  5.     public void MouseDownMover() {  
  6.         if(Input.GetMouseButtonDown(0)) {  //如果左击  
  7.             LayerMask layerMaskPlayers = 1 << LayerMask.NameToLayer("Terrain");  
  8.             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  
  9.             RaycastHit hit;  
  10.             if (Physics.Raycast(ray, out hit,600,layerMaskPlayers.value)) {  
  11.                 point = hit.point;  
  12.                 Instantiate(clickPont, point, transform.rotation);  
  13.                 TimeRealtimeSinceStartup();  
  14.             }  
  15.         }  
  16.     }  

2.准备好人物模型,并且将三个脚本拖放到人物上,并且将动画文件也拖放好,记得看前面提醒哦!

1.ThirdPersonCamera(相当于smoothflow)

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /*  
  2. Perfect Camera Control Script  By zhoy;  
  3. Which can be toggled between First-Person Look And Third-Person Look   
  4. And it also realised freely Look-around  the world with mouse move  
  5. */  
  6.   
  7. var cameraTransform : Transform;  
  8. var distance = 7.0;  
  9.   
  10. var xSpeed = 100;  
  11. var ySpeed = 100;  
  12. var mSpeed = 10;  
  13.   
  14. var angularSmoothLag = 0.3;  
  15. var angularMaxSpeed = 15.0;  
  16.   
  17. var snapSmoothLag = 0.2;  
  18. var snapMaxSpeed = 720.0;  
  19.   
  20. var clampHeadPositionScreenSpace = 0.75;  
  21.   
  22.   
  23. private var _target : Transform;  
  24.   
  25. //var secondCamera : Camera;  
  26. private var mainCamera : Camera;  
  27.   
  28. private var controller : ThirdPersonController;  
  29.   
  30. private var headOffset    = Vector3.zero;  
  31. private var centerOffset  = Vector3.zero;  
  32.   
  33.   
  34. private var dosnap     = false;  
  35. private var snapped    = false;  
  36. private var firstPersonLook  = false;  
  37. private var angleVelocity    = 0.0;  
  38.   
  39. private var minAngleY   = -45;  
  40. private var yTopLimit   = -20.0;  
  41. private var yMinLimit   = -45;  
  42. private var yMaxLimit   =  45;  
  43. private var minDistance =  1.2;  
  44. private var maxDistance =  3.5;  
  45.   
  46.   
  47. private var current_ver_angle  = 0.0;  
  48. private var current_hor_angle  = 0.0;  
  49. private var look_height        = 0.0;  
  50.   
  51. private var bSeePicture = false;  
  52. private var curPicturePos:Vector3;  
  53. private var curPictureRotation:Quaternion;  
  54. private var curPictureTran: Transform;  
  55. function Awake ()  
  56. {  
  57.     //secondCamera.enabled = false;  
  58.     mainCamera = Camera.main;  
  59.     cameraTransform = GameObject.Find("Main Camera").transform;  
  60.     if(!cameraTransform && mainCamera)  
  61.     {  
  62.         cameraTransform = mainCamera.transform;  
  63.     }  
  64.   
  65.     if(!cameraTransform)   
  66.     {  
  67.         Debug.Log("Please assign a camera to the ThirdPersonCamera script.");  
  68.         enabled = false;      
  69.     }  
  70.                   
  71.     _target = transform;  
  72.     if (_target)  
  73.     {  
  74.         controller = _target.GetComponent(ThirdPersonController);  
  75.     }  
  76.       
  77.     if (controller)  
  78.     {  
  79.         var characterController : CharacterController = _target.collider;  
  80.         centerOffset = characterController.bounds.center - _target.position;  
  81.         headOffset = centerOffset;  
  82.           
  83.   
  84.         var look_target = _target.Find("LookTarget");  
  85.         //Debug.Log(look_target);  
  86.         var head_back_pos    = characterController.bounds.max;  
  87.         if(look_target)  
  88.         {  
  89.             head_back_pos = look_target.transform.position;  
  90.         }  
  91.         var hit_test : RaycastHit;    
  92.         var head_top = characterController.bounds.center;  
  93.         head_top.y = characterController.bounds.min.y;  
  94.           
  95.         if(Physics.Raycast(head_top,Vector3.down,hit_test,50))  
  96.         {  
  97.             look_height = head_back_pos.y - hit_test.point.y;     
  98.         }         
  99.       
  100.         //Debug.Log("look_height : " + look_height);  
  101.         headOffset.y = head_back_pos.y - _target.position.y;  
  102.   
  103.         /*下面计算、保存 相机稳定后 的初始位置与方位*/    
  104.         var hor_angle = _target.eulerAngles.y;            
  105.         var rotation_h = Quaternion.Euler (0, hor_angle, 0);      
  106.         var camera_pos = head_back_pos;  
  107.           
  108.         camera_pos += rotation_h * Vector3.back * distance; /*计算相机位置是用 头部为球中心计算的*/  
  109.           
  110.         var offsetToCenter = head_back_pos - camera_pos;  
  111.         var rotation = Quaternion.LookRotation(Vector3(offsetToCenter.x, offsetToCenter.y, offsetToCenter.z));  
  112.         current_hor_angle = 360 - rotation.eulerAngles.y;  
  113.         current_ver_angle = rotation.eulerAngles.x;   
  114.     }  
  115.     else  
  116.     {  
  117.         Debug.Log("Please assign a target to the camera that has a ThirdPersonController script attached.");  
  118.     }  
  119.   
  120.     Cut(_target, centerOffset);   
  121. }  
  122.   
  123. function SetVisible(visible)  
  124. {  
  125.     var renderers = gameObject.GetComponentsInChildren(Renderer);  
  126.     if(visible)  
  127.     {   
  128.         for(var rend:Renderer in renderers){  
  129.             rend.enabled = true;  
  130.         }  
  131.         firstPersonLook = false;  
  132.     }  
  133.     else  
  134.     {   
  135.         for(var rend:Renderer in renderers)  
  136.         {  
  137.             rend.enabled = false;  
  138.         }  
  139.         firstPersonLook = true;   
  140.     }  
  141. }  
  142. function Cut (dummyTarget : Transform, dummyCenter : Vector3)  
  143. {  
  144.     var oldSnapMaxSpeed   = snapMaxSpeed;  
  145.     var oldSnapSmooth     = snapSmoothLag;  
  146.       
  147.     snapMaxSpeed = 10000;  
  148.     snapSmoothLag = 0.001;  
  149.       
  150.     dosnap  = true;  
  151.   
  152.     Apply (transform, Vector3.zero);  
  153.       
  154.     snapMaxSpeed = oldSnapMaxSpeed;  
  155.     snapSmoothLag = oldSnapSmooth;  
  156. }  
  157.   
  158. function DebugDrawStuff ()  
  159. {  
  160.     Debug.DrawLine(_target.position, _target.position + headOffset);  
  161. }  
  162.   
  163. function AngleDistance (a : float, b : float)  
  164. {  
  165.     a = Mathf.Repeat(a, 360);  
  166.     b = Mathf.Repeat(b, 360);  
  167.       
  168.     return Mathf.Abs(b - a);  
  169. }  
  170.   
  171.   
  172. function Apply (dummyTarget : Transform, dummyCenter : Vector3)  
  173. {  
  174.        
  175.     // Early out if we don't have a target  
  176.     if (!controller)  
  177.     {  
  178.         return;  
  179.     }  
  180.     var needGoOn = false;     
  181.     var targetCenter = _target.position + centerOffset;  
  182.     var targetHead = _target.position + headOffset;  
  183.   
  184.     var strength = Input.GetAxis("Mouse ScrollWheel");  
  185.     if(strength != 0)  
  186.     {  
  187.         distance -= strength*mSpeed;  
  188.         distance =  Mathf.Clamp(distance, minDistance, maxDistance);      
  189.         /*  
  190.         if(distance <= 1)  
  191.         {  
  192.             SetVisible(false);  
  193.             minAngleY = -80;          
  194.         }     
  195.         else if(firstPersonLook)  
  196.         {  
  197.             SetVisible(true);  
  198.         }     
  199.         else if(distance < look_height)  
  200.         {  
  201.             minAngleY = (distance - 2) * (yTopLimit - yMinLimit)/(look_height - 2) - yTopLimit;   
  202.             minAngleY = - minAngleY;          
  203.         }  
  204.         else  
  205.         {  
  206.             minAngleY = yMinLimit;  
  207.         }  
  208.         */  
  209.         needGoOn = true;          
  210.     }  
  211.   
  212.     var originalTargetAngle = 360 - _target.eulerAngles.y;    
  213.     current_hor_angle = 360 - cameraTransform.eulerAngles.y;  
  214.     if(!snapped)  
  215.     {  
  216.         var targetAngle = originalTargetAngle;    
  217.         var dis_angle = 0;    
  218.         if (dosnap)  
  219.         {  
  220.             dis_angle = AngleDistance (360 - current_hor_angle, originalTargetAngle);  
  221.             current_hor_angle = Mathf.SmoothDampAngle(current_hor_angle, targetAngle, angleVelocity, snapSmoothLag, snapMaxSpeed);    
  222.         }  
  223.       
  224.             // We are close to the target, so we can stop snapping now!  
  225.         dis_angle= 0;  
  226.         if (dis_angle <= 13)  
  227.         {  
  228.             snapped = true;  
  229.             dosnap  = false;  
  230.       
  231.         }  
  232.         else if(dis_angle < 3)  
  233.         {  
  234.             dosnap  = false;          
  235.         }  
  236.         if(!snapped && !dosnap)  
  237.         {  
  238.             current_hor_angle = Mathf.SmoothDampAngle(current_hor_angle, targetAngle, angleVelocity, angularSmoothLag, angularMaxSpeed);              
  239.         }  
  240.         needGoOn = true;  
  241.     }  
  242.     else  
  243.     {  
  244.             var rotation_h =0;  
  245.             var rotation_v =0;    
  246.         if (Input.GetMouseButton(1)) {  
  247.              rotation_h =  -Input.GetAxis("Mouse X") * xSpeed *0.02;  
  248.              rotation_v =  -Input.GetAxis("Mouse Y") * ySpeed *0.02;      
  249.               
  250.         }  
  251.         needGoOn = needGoOn || (rotation_h != 0 || rotation_v != 0);  
  252.               
  253.         current_hor_angle += rotation_h;      
  254.         current_hor_angle = Mathf.Repeat(current_hor_angle, 360);         
  255.         current_ver_angle += rotation_v;  
  256.         current_ver_angle = Mathf.Clamp (current_ver_angle, minAngleY, yMaxLimit);  
  257.           
  258.     }  
  259.   
  260.     needGoOn = needGoOn || controller.IsMoving();  
  261.     needGoOn = needGoOn || controller.IsJumping();    
  262.     if(!needGoOn)/*没有鼠标键盘事件,返回即可,相机一般不会自动更新。除非未来有其他情形,那时候再添加*/  
  263.     {  
  264.         var mousecl = GetComponent("mouseMoveContr");  
  265.         var mouseMoveFlag = mousecl.getmousemoveFlag();  
  266.         if (!mouseMoveFlag) {  
  267.             return;  
  268.         }  
  269.     }  
  270.           
  271.     var rad_angle_h = (current_hor_angle - 90.0)*Mathf.Deg2Rad;  
  272.     var rad_angle_v = current_ver_angle*Mathf.Deg2Rad;  
  273.     var camera_pos = Vector3.zero;  
  274.     var radius_hor =  distance*Mathf.Cos(rad_angle_v);    
  275.     var slope      = -Mathf.Sin(rad_angle_v);     
  276.       
  277.     camera_pos.x = radius_hor*Mathf.Cos(rad_angle_h) + targetHead.x;/*计算相机位置是用 头部为球中心计算的*/  
  278.     camera_pos.z = radius_hor*Mathf.Sin(rad_angle_h) + targetHead.z;      
  279.     camera_pos.y = -distance*slope + targetHead.y;    
  280.     if(camera_pos.y < targetHead.y - look_height)  
  281.     {  
  282.         camera_pos.y = targetHead.y - look_height;  
  283.     }  
  284.       
  285.     var hit : RaycastHit;  
  286.     var modified = false;  
  287.       
  288.     var hor_dis     = 0.0;  
  289.       
  290.     if(camera_pos.y < targetCenter.y)  
  291.     {     
  292.         var testPt = camera_pos;  
  293.         testPt.y = targetCenter.y;    
  294.         if(Physics.Raycast(testPt,Vector3.down,hit,50))/*这个检测必须进行,不能完全指望后面的检测,否则会有微小的显示问题。一般发生在摄像机贴近地面跑动时*/  
  295.         {  
  296.             if(camera_pos.y < hit.point.y + 0.5)/*偏移0.5.防止过于接近地面,并且在地面上面的情况,会因为摄像机近截面问题。导致显示地下的内容*/  
  297.             {  
  298.                 modified = true;                      
  299.             }                     
  300.         }     
  301.     }  
  302.     if(modified)  
  303.     {         
  304.         hor_dis  = Vector3.Distance(targetCenter,Vector3(camera_pos.x,targetCenter.y,camera_pos.z));              
  305.         camera_pos = hit.point;  
  306.         camera_pos.y = (slope > 0.95)?hit.point.y:(camera_pos.y + hor_dis/maxDistance);  
  307.         //摄像头在脚下的时候,hor_dis几乎为0  
  308.         modified = false;  
  309.         //Debug.Log("hit down.....camera_pos : " +camera_pos);        
  310.     }     
  311.   
  312.     var real_dis = Vector3.Distance(targetCenter,camera_pos);  
  313.     var direction = camera_pos - targetCenter;  
  314.   
  315.     if(Physics.Raycast(targetCenter,direction,hit,real_dis) && hit.collider.gameObject != gameObject)  
  316.     {  
  317. //      modified = false;  
  318. //      if(hit.collider.bounds.size.magnitude <= 15) {  
  319. //          modified = false;     
  320. //      } else if (hit.collider.gameObject.tag == "bridge") {  
  321. //          camera_pos.y = camera_pos.y + 2.5;  
  322. //      } else if (hit.collider.gameObject.tag == "through"){  
  323. //          modified = false;  
  324. //      } else {  
  325. //          modified = true;  
  326. //      }  
  327. //      Debug.LogError(hit.point.y < targetHead.y);  
  328.         camera_pos = hit.point;  
  329.         if(hit.point.y < targetHead.y){  
  330.             camera_pos.y = targetHead.y;  
  331. //          Debug.LogError(camera_pos);  
  332.         }  
  333.     }  
  334. //    
  335. //  if(modified)  
  336. //  {     
  337. //      hor_dis  = Vector3.Distance(targetCenter,Vector3(camera_pos.x,targetCenter.y,camera_pos.z));              
  338. //      camera_pos   = hit.point;  
  339. //      camera_pos.y = (slope > 0.95)?hit.point.y:(camera_pos.y + hor_dis/maxDistance);/*摄像头在脚下的时候,hor_dis几乎为0*/   
  340. //  }     
  341.     cameraTransform.position = camera_pos;    
  342.     var offsetToCenter = targetHead - cameraTransform.position;  
  343.     cameraTransform.rotation = Quaternion.LookRotation(Vector3(offsetToCenter.x, offsetToCenter.y, offsetToCenter.z));  
  344.     Debug.DrawLine(targetCenter, camera_pos, Color.red);  
  345. }  
  346.   
  347. function EventMouseClicked(){  
  348. //  Debug.LogError(Input.mousePosition);  
  349.     var mousePos:Vector3 = Input.mousePosition;  
  350.     var ray:Ray;  
  351.     ray = Camera.main.ScreenPointToRay(mousePos);  
  352.     var hitInfo:RaycastHit;  
  353.     var cameraTran:Transform;  
  354.     cameraTran = Camera.main.transform;  
  355.     if(Input.GetMouseButtonDown(0)){  
  356.         if(Physics.Raycast(ray, hitInfo, 50f, (1<<9))){  
  357.             Debug.LogError(hitInfo.transform.gameObject.layer);  
  358. //          curPicturePos = hitInfo.point;  
  359. //          curPicturePos = hitInfo.transform.Find("CameraPos").position;  
  360. //          curPictureRotation = hitInfo.transform.Find("CameraPos").rotation;  
  361.             curPictureTran = hitInfo.transform.Find("CameraPos");  
  362.             bSeePicture = !bSeePicture;  
  363.             if(bSeePicture){  
  364.                 GetComponent(ThirdPersonController).enabled = false;  
  365.             }else{  
  366.                 GetComponent(ThirdPersonController).enabled = true;  
  367.             }  
  368.         }  
  369.     }  
  370. }  
  371. function LateUpdate ()   
  372. {  
  373.     if (Input.GetKeyUp (KeyCode.Tab))  
  374.     {  
  375.         var hit2 : RaycastHit;   
  376.         Debug.Log("Camera Pos.y : " + cameraTransform.position.y);  
  377.         var testPt = cameraTransform.position;  
  378.         testPt.y = 50;    
  379.         if(Physics.Raycast(testPt,Vector3.down,hit2,50))  
  380.         {  
  381.             Debug.Log("hit2.point.y : " + hit2.point.y);          
  382.         }         
  383.     }  
  384.     EventMouseClicked();  
  385.     if(!bSeePicture){  
  386.         Apply (transform, Vector3.zero);  
  387.     }else{  
  388. //      Camera.main.transform.position = transform.position;  
  389. //      Camera.main.transform.position.y = curPicturePos.y;  
  390.         Camera.main.transform.rotation = Quaternion.LookRotation(curPicturePos - Camera.main.transform.position);  
  391. //      Camera.main.transform.rotation = transform.rotation;  
  392. //      Camera.main.transform.position = curPicturePos;  
  393. //      Camera.main.transform.rotation = curPictureRotation;  
  394.         Camera.main.transform.rotation = curPictureTran.rotation;  
  395.         Camera.main.transform.position = curPictureTran.position;  
  396.     }  
  397. }  
  398.   
  399. function GetCenterOffset ()  
  400. {  
  401.     return centerOffset;  
  402. }  
  403. /*  
  404. function UpdateSecondCamPos(lookat,campos)  
  405. {  
  406.     var ccnter  = Vector3.Lerp(campos,lookat,0.5);  
  407.     var forward = ccnter - campos;  
  408.     forward = forward.normalized;  
  409.     forward.y = 0;  
  410.     var right = Vector3.Cross (Vector3.up, forward);  
  411.     var setpos = ccnter + right*30;  
  412.       
  413.     secondCamera.transform.position = setpos;  
  414.     var offset = ccnter - setpos;  
  415.     //Debug.DrawRay(campos,lookat - campos,Color.red,100000);  
  416.     var t1 = Time.time;  
  417.     GameObject.Find("TestObject").transform.position = campos;  
  418.     var t2= Time.time;  
  419.       
  420.     secondCamera.transform.rotation = Quaternion.LookRotation(Vector3(offset.x, offset.y, offset.z));     
  421. }  
  422. */  
  423. /*  
  424. if (Input.GetKeyUp (KeyCode.Tab))  
  425. {  
  426.     var hit2 : RaycastHit;   
  427.     Debug.Log("Camera Pos.y : " + cameraTransform.position.y);  
  428.     var testPt = cameraTransform.position;  
  429.     testPt.y = 50;    
  430.     if(Physics.Raycast(testPt,Vector3.down,hit2,50))  
  431.     {  
  432.         Debug.Log("hit2.point.y : " + hit2.point.y);          
  433.     }         
  434.   
  435.     if(mainCamera.enabled)  
  436.     {  
  437.         controller.SwitchCamera(secondCamera);   
  438.   
  439.     }  
  440.     else  
  441.     {  
  442.         controller.SwitchCamera(mainCamera);                      
  443.     }  
  444.   
  445. }     
  446. */  
  447.     

2.ThirdPersonController(修改版)

[plain] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. // Require a character controller to be attached to the same game object  
  2. @script RequireComponent(CharacterController)  
  3.   
  4. public var idleAnimation : AnimationClip;  
  5. public var walkAnimation : AnimationClip;  
  6. public var runAnimation : AnimationClip;  
  7. public var jumpPoseAnimation : AnimationClip;  
  8.   
  9. public var kneeAnimation : AnimationClip;  
  10.   
  11. public var walkMaxAnimationSpeed : float = 0.75;  
  12. public var trotMaxAnimationSpeed : float = 1.0;  
  13. public var runMaxAnimationSpeed : float = 1.0;  
  14. public var jumpAnimationSpeed : float = 1.15;  
  15. public var landAnimationSpeed : float = 1.0;  
  16.   
  17. private var _animation : Animation;  
  18.   
  19. enum CharacterState {  
  20.     Idle = 0,  
  21.     Walking = 1,  
  22.     Trotting = 2,  
  23.     Running = 3,  
  24.     Jumping = 4,  
  25. }  
  26.   
  27. private var _characterState : CharacterState;  
  28.   
  29. // The speed when walking  
  30. var walkSpeed = 2.0;  
  31. // after trotAfterSeconds of walking we trot with trotSpeed  
  32. var trotSpeed = 4.0;  
  33. // when pressing "Fire3" button (cmd) we start running  
  34. var runSpeed = 6.0;  
  35.   
  36. var inAirControlAcceleration = 3.0;  
  37.   
  38. // How high do we jump when pressing jump and letting go immediately  
  39. var jumpHeight = 0.5;  
  40.   
  41. // The gravity for the character  
  42. var gravity = 20.0;  
  43. // The gravity in controlled descent mode  
  44. var speedSmoothing = 10.0;  
  45. var rotateSpeed = 500.0;  
  46. var trotAfterSeconds = 3.0;  
  47.   
  48. var canJump = true;  
  49.   
  50. private var jumpRepeatTime = 0.05;  
  51. private var jumpTimeout = 0.15;  
  52. private var groundedTimeout = 0.25;  
  53.   
  54. // The camera doesnt start following the target immediately but waits for a split second to avoid too much waving around.  
  55. private var lockCameraTimer = 0.0;  
  56.   
  57. // The current move direction in x-z  
  58. private var moveDirection = Vector3.zero;  
  59. // The current vertical speed  
  60. private var verticalSpeed = 0.0;  
  61. // The current x-z move speed  
  62. private var moveSpeed = 0.0;  
  63.   
  64. // The last collision flags returned from controller.Move  
  65. private var collisionFlags : CollisionFlags;   
  66.   
  67. // Are we jumping? (Initiated with jump button and not grounded yet)  
  68. private var jumping = false;  
  69. private var jumpingReachedApex = false;  
  70.   
  71. // Are we moving backwards (This locks the camera to not do a 180 degree spin)  
  72. private var movingBack = false;  
  73. // Is the user pressing any keys?  
  74. private var isMoving = false;  
  75. // When did the user start walking (Used for going into trot after a while)  
  76. private var walkTimeStart = 0.0;  
  77. // Last time the jump button was clicked down  
  78. private var lastJumpButtonTime = -10.0;  
  79. // Last time we performed a jump  
  80. private var lastJumpTime = -1.0;  
  81.   
  82.   
  83. // the height we jumped from (Used to determine for how long to apply extra jump power after jumping.)  
  84. private var lastJumpStartHeight = 0.0;  
  85.   
  86.   
  87. private var inAirVelocity = Vector3.zero;  
  88.   
  89. private var lastGroundedTime = 0.0;  
  90.   
  91.   
  92. private var isControllable = true;  
  93.   
  94. private var activeCamera : Camera;  
  95.   
  96. //private var scenesCode = "S";  
  97.   
  98. function Start() {  
  99.     //scenesCode = GameObject.Find("Main Camera").GetComponent("createusers").getScenesCode();  
  100. }  
  101.   
  102. function LateUpdate() {  
  103.       
  104. }  
  105.   
  106. function Awake ()  
  107. {  
  108.     moveDirection = transform.TransformDirection(Vector3.forward);  
  109.       
  110.     _animation = GetComponent(Animation);  
  111.     if(!_animation)  
  112.         Debug.Log("The character you would like to control doesn't have animations. Moving her might look weird.");  
  113.       
  114.     /*  
  115. public var idleAnimation : AnimationClip;  
  116. public var walkAnimation : AnimationClip;  
  117. public var runAnimation : AnimationClip;  
  118. public var jumpPoseAnimation : AnimationClip;     
  119.     */  
  120.     if(!idleAnimation) {  
  121.         _animation = null;  
  122.         Debug.Log("No idle animation found. Turning off animations.");  
  123.     }  
  124.     if(!walkAnimation) {  
  125.         _animation = null;  
  126.         Debug.Log("No walk animation found. Turning off animations.");  
  127.     }  
  128.     if(!runAnimation) {  
  129.         _animation = null;  
  130.         Debug.Log("No run animation found. Turning off animations.");  
  131.     }  
  132.     if(!jumpPoseAnimation && canJump) {  
  133.         _animation = null;  
  134.         Debug.Log("No jump animation found and the character has canJump enabled. Turning off animations.");  
  135.     }  
  136.     activeCamera = Camera.main;  
  137.     Screen.lockCursor = false;            
  138. }  
  139. /*  
  140. function SwitchCamera(camera:Camera)  
  141. {  
  142.     activeCamera.enabled = false;  
  143.     activeCamera = camera;  
  144.     activeCamera.enabled = true;  
  145. }  
  146. */  
  147. function UpdateSmoothedMovementDirection ()  
  148. {  
  149.     var cameraTransform = activeCamera.transform;  
  150.     var grounded = IsGrounded();  
  151.       
  152.     // Forward vector relative to the camera along the x-z plane      
  153.     var forward = cameraTransform.TransformDirection(Vector3.forward);  
  154.     forward.y = 0;  
  155.     forward = forward.normalized;  
  156.   
  157.     // Right vector relative to the camera  
  158.     // Always orthogonal to the forward vector  
  159.     var right = Vector3(forward.z, 0, -forward.x);  
  160.   
  161.     var v = Input.GetAxisRaw("Vertical");  
  162.     var h = Input.GetAxisRaw("Horizontal");  
  163.   
  164.     // Are we moving backwards or looking backwards  
  165.     if (v < -0.2)  
  166.         movingBack = true;  
  167.     else  
  168.         movingBack = false;  
  169.       
  170.     var wasMoving = isMoving;  
  171.     isMoving = Mathf.Abs (h) > 0.1 || Mathf.Abs (v) > 0.1;  
  172.           
  173.     // Target direction relative to the camera  
  174.     var targetDirection = h * right + v * forward;  
  175.   
  176.     // Grounded controls  
  177.     if (grounded)  
  178.     {  
  179.         // Lock camera for short period when transitioning moving & standing still  
  180.         lockCameraTimer += Time.deltaTime;  
  181.         if (isMoving != wasMoving)  
  182.             lockCameraTimer = 0.0;  
  183.   
  184.         // We store speed and direction seperately,  
  185.         // so that when the character stands still we still have a valid forward direction  
  186.         // moveDirection is always normalized, and we only update it if there is user input.  
  187.         if (targetDirection != Vector3.zero)  
  188.         {  
  189.             // If we are really slow, just snap to the target direction  
  190.             if (moveSpeed < walkSpeed * 0.9 && grounded)  
  191.             {  
  192.                 moveDirection = targetDirection.normalized;  
  193.             }  
  194.             // Otherwise smoothly turn towards it  
  195.             else  
  196.             {  
  197.                 moveDirection = Vector3.RotateTowards(moveDirection, targetDirection, rotateSpeed * Mathf.Deg2Rad * Time.deltaTime, 1000);  
  198.                   
  199.                 moveDirection = moveDirection.normalized;  
  200.             }  
  201.         }  
  202.       
  203.         // Smooth the speed based on the current target direction  
  204.         var curSmooth = speedSmoothing * Time.deltaTime;  
  205.           
  206.         // Choose target speed  
  207.         //* We want to support analog input but make sure you cant walk faster diagonally than just forward or sideways  
  208.         var targetSpeed = Mathf.Min(targetDirection.magnitude, 1.0);  
  209.       
  210.         _characterState = CharacterState.Idle;  
  211.           
  212.         // Pick speed modifier  
  213.         if (Input.GetKey (KeyCode.LeftShift) || Input.GetKey (KeyCode.RightShift))  
  214.         {  
  215.             targetSpeed *= runSpeed;  
  216.             _characterState = CharacterState.Running;  
  217.         }  
  218.         else if (Time.time - trotAfterSeconds > walkTimeStart)  
  219.         {  
  220.             targetSpeed *= trotSpeed;  
  221.             _characterState = CharacterState.Trotting;  
  222.         }  
  223.         else  
  224.         {  
  225.             targetSpeed *= walkSpeed;  
  226.             _characterState = CharacterState.Walking;  
  227.         }  
  228.           
  229.         moveSpeed = Mathf.Lerp(moveSpeed, targetSpeed, curSmooth);  
  230.           
  231.         // Reset walk time start when we slow down  
  232.         if (moveSpeed < walkSpeed * 0.3)  
  233.             walkTimeStart = Time.time;  
  234.     }  
  235.     // In air controls  
  236.     else  
  237.   
  238.     {  
  239.         // Lock camera while in air  
  240.         if (jumping)  
  241.             lockCameraTimer = 0.0;  
  242.   
  243.         if (isMoving)  
  244.             inAirVelocity += targetDirection.normalized * Time.deltaTime * inAirControlAcceleration;  
  245.     }  
  246.           
  247. }  
  248.   
  249.   
  250. function ApplyJumping ()  
  251. {  
  252.     // Prevent jumping too fast after each other  
  253.     if (lastJumpTime + jumpRepeatTime > Time.time)  
  254.         return;  
  255.   
  256.     if (IsGrounded())   
  257.     {  
  258.         // Jump  
  259.         // - Only when pressing the button down  
  260.         // - With a timeout so you can press the button slightly before landing       
  261.         if (canJump && Time.time < lastJumpButtonTime + jumpTimeout) {  
  262.             verticalSpeed = CalculateJumpVerticalSpeed (jumpHeight);  
  263.             SendMessage("DidJump", SendMessageOptions.DontRequireReceiver);  
  264.         }  
  265.     }  
  266. }  
  267.   
  268.   
  269. function ApplyGravity ()  
  270. {  
  271.     if (isControllable) // don't move player at all if not controllable.  
  272.     {  
  273.         // Apply gravity  
  274.         var jumpButton = Input.GetButton("Jump");  
  275.           
  276.           
  277.         // When we reach the apex of the jump we send out a message  
  278.         if (jumping && !jumpingReachedApex && verticalSpeed <= 0.0)  
  279.         {  
  280.             jumpingReachedApex = true;  
  281.             SendMessage("DidJumpReachApex", SendMessageOptions.DontRequireReceiver);  
  282.         }  
  283.       
  284.         if (IsGrounded ())  
  285.             verticalSpeed = 0.0;  
  286.         else  
  287.             verticalSpeed -= gravity * Time.deltaTime;  
  288.     }  
  289. }  
  290.   
  291. function CalculateJumpVerticalSpeed (targetJumpHeight : float)  
  292. {  
  293.     // From the jump height and gravity we deduce the upwards speed   
  294.     // for the character to reach at the apex.  
  295.     return Mathf.Sqrt(2 * targetJumpHeight * gravity);  
  296. }  
  297.   
  298. function DidJump ()  
  299. {  
  300.     jumping = true;  
  301.     jumpingReachedApex = false;  
  302.     lastJumpTime = Time.time;  
  303.     lastJumpStartHeight = transform.position.y;  
  304.     lastJumpButtonTime = -10;  
  305.       
  306.     _characterState = CharacterState.Jumping;  
  307. }  
  308.   
  309. function Update() {  
  310.     if (_animation.IsPlaying("kneel")) {  
  311.         return;  
  312.     }  
  313.     if (!isControllable)  
  314.     {  
  315.         // kill all inputs if not controllable.  
  316.         Input.ResetInputAxes();  
  317.     }  
  318.   
  319.     if (Input.GetButtonDown ("Jump") && !jumping)  
  320.     {  
  321.         lastJumpButtonTime = Time.time;  
  322.     }  
  323.     if (Input.GetKeyUp (KeyCode.Escape))  
  324.     {  
  325.         Screen.lockCursor = !Screen.lockCursor;       
  326.     }  
  327.   
  328.     UpdateSmoothedMovementDirection();  
  329.       
  330.     // Apply gravity  
  331.     // - extra power jump modifies gravity  
  332.     // - controlledDescent mode modifies gravity  
  333.     ApplyGravity ();  
  334.   
  335.     // Apply jumping logic  
  336.     ApplyJumping ();  
  337.     //鼠标移动  
  338.     var mousecl = GetComponent("mouseMoveContr");  
  339.     var mouseMoveFlag = mousecl.getmousemoveFlag();  
  340.       
  341.     if (mouseMoveFlag){  
  342.         if (checkKeyDown()) {  
  343.             mousecl.setMouseMoveFlag();  
  344.         } else {  
  345.             moveDirection = mousecl.getMovement();  
  346.             moveSpeed = mousecl.getMoveSpeed();  
  347.             if (moveSpeed == 4.2) {  
  348.                 _characterState = CharacterState.Running;  
  349.             }  
  350.         }  
  351.     }  
  352.     // Calculate actual motion  
  353.     var movement = moveDirection * moveSpeed + Vector3 (0, verticalSpeed, 0) + inAirVelocity;  
  354.     movement *= Time.deltaTime;  
  355.       
  356.     // Move the controller  
  357.     var controller : CharacterController = GetComponent(CharacterController);  
  358.       
  359.     collisionFlags = controller.Move(movement);  
  360.     if (_characterState == CharacterState.Running) {  
  361.         if (mouseMoveFlag){  
  362.             if(controller.velocity.sqrMagnitude < 100) {  
  363.                 _characterState = CharacterState.Walking;  
  364.             }  
  365.         }  
  366.     }  
  367.     // ANIMATION sector  
  368.     if(_animation) {  
  369.         if(_characterState == CharacterState.Jumping)   
  370.         {  
  371.             if(!jumpingReachedApex) {  
  372.                 _animation[jumpPoseAnimation.name].speed = jumpAnimationSpeed;  
  373.                 _animation[jumpPoseAnimation.name].wrapMode = WrapMode.ClampForever;  
  374.                 _animation.CrossFade(jumpPoseAnimation.name);  
  375.             } else {  
  376.                 _animation[jumpPoseAnimation.name].speed = -landAnimationSpeed;  
  377.                 _animation[jumpPoseAnimation.name].wrapMode = WrapMode.ClampForever;  
  378.                 _animation.CrossFade(jumpPoseAnimation.name);                 
  379.             }  
  380.         }   
  381.         else   
  382.         {  
  383.           
  384.             if(controller.velocity.sqrMagnitude < 0.1) {  
  385.                 _animation.CrossFade(idleAnimation.name);  
  386.             }  
  387.             else   
  388.             {  
  389.                 if(_characterState == CharacterState.Running) {  
  390.                     _animation[runAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, runMaxAnimationSpeed);  
  391.                     _animation.CrossFade(runAnimation.name);      
  392.                 }  
  393.                 else if(_characterState == CharacterState.Trotting) {  
  394.                     _animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, trotMaxAnimationSpeed);  
  395.                     _animation.CrossFade(walkAnimation.name);     
  396.                 }  
  397.                 else if(_characterState == CharacterState.Walking) {  
  398.                     _animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, walkMaxAnimationSpeed);  
  399.                     _animation.CrossFade(walkAnimation.name);     
  400.                 }  
  401.                   
  402.             }  
  403.         }  
  404.     }  
  405.     // ANIMATION sector  
  406.       
  407.     // Set rotation to the move direction  
  408.     if (IsGrounded())  
  409.     {  
  410.           
  411.         transform.rotation = Quaternion.LookRotation(moveDirection);  
  412.   
  413.     }     
  414.     else  
  415.     {  
  416.         var xzMove = movement;  
  417.         xzMove.y = 0;  
  418.         if (xzMove.sqrMagnitude > 0.001)  
  419.         {  
  420.             transform.rotation = Quaternion.LookRotation(xzMove);  
  421.         }  
  422.     }     
  423.       
  424.     // We are in jump mode but just became grounded  
  425.     if (IsGrounded())  
  426.     {  
  427.         lastGroundedTime = Time.time;  
  428.         inAirVelocity = Vector3.zero;  
  429.         if (jumping)  
  430.         {  
  431.             jumping = false;  
  432.             SendMessage("DidLand", SendMessageOptions.DontRequireReceiver);  
  433.         }  
  434.     }  
  435. }  
  436.   
  437. function OnControllerColliderHit (hit : ControllerColliderHit )  
  438. {  
  439. //  Debug.DrawRay(hit.point, hit.normal);  
  440.     if (hit.moveDirection.y > 0.01)   
  441.         return;  
  442. }  
  443.   
  444. function GetSpeed () {  
  445.     return moveSpeed;  
  446. }  
  447.   
  448. function IsJumping () {  
  449.     return jumping;  
  450. }  
  451.   
  452. function IsGrounded () {  
  453.     return (collisionFlags & CollisionFlags.CollidedBelow) != 0;  
  454. }  
  455.   
  456. function GetDirection () {  
  457.     return moveDirection;  
  458. }  
  459.   
  460. function IsMovingBackwards () {  
  461.     return movingBack;  
  462. }  
  463.   
  464. function GetLockCameraTimer ()   
  465. {  
  466.     return lockCameraTimer;  
  467. }  
  468. function GetCharacterState() :CharacterState  
  469. {  
  470.     return _characterState;  
  471. }  
  472.   
  473. function IsMoving ()  : boolean  
  474. {  
  475.     return Mathf.Abs(Input.GetAxisRaw("Vertical")) + Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5;  
  476. }  
  477.   
  478. function HasJumpReachedApex ()  
  479. {  
  480.     return jumpingReachedApex;  
  481. }  
  482.   
  483. function IsGroundedWithTimeout ()  
  484. {  
  485.     return lastGroundedTime + groundedTimeout > Time.time;  
  486. }  
  487.   
  488. function Reset ()  
  489. {  
  490.     gameObject.tag = "Player";  
  491. }  
  492. function checkKeyDown():boolean {  
  493.     if (Input.GetKey(KeyCode.W)) {  
  494.         return true;  
  495.     }  
  496.     if (Input.GetKey(KeyCode.A)) {  
  497.         return true;  
  498.     }  
  499.     if (Input.GetKey(KeyCode.S)) {  
  500.         return true;  
  501.     }  
  502.     if (Input.GetKey(KeyCode.D)) {  
  503.         return true;  
  504.     }  
  505.     if (Input.GetKey(KeyCode.UpArrow)) {  
  506.         return true;  
  507.     }  
  508.     if (Input.GetKey(KeyCode.DownArrow)) {  
  509.         return true;  
  510.     }  
  511.     if (Input.GetKey(KeyCode.RightArrow)) {  
  512.         return true;  
  513.     }  
  514.     if (Input.GetKey(KeyCode.LeftArrow)) {  
  515.         return true;  
  516.     }  
  517.     return false;  
  518. }  

3.mouseMoveContr(鼠标点击人物走动)

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class mouseMoveContr : MonoBehaviour {  
  5.     public const int PLAY_IDLE = 0;  
  6.     public const int PLAY_WALK = 1;  
  7.     public const int PLAY_RUN  = 2;  
  8.     public const int PLAY_KNEE  = 3;  
  9.     //public GameObject clickPont;  
  10.     public float walkSpeed = 2;  
  11.     public float runSpeed = 4.5f;  
  12.       
  13.     private bool moveflag = false;  
  14.       
  15.     private int gameState = 0;  
  16.     private Vector3 point;  
  17.     private float time;  
  18.     private Vector3 v;  
  19.     private Vector3 lotav;  
  20.     private float moveSpeed = 0.0f;  
  21.       
  22.     void Start () {  
  23.         SetGameState(PLAY_IDLE);  
  24.     }  
  25.       
  26.     void Update () {  
  27.         MouseDownMover();  
  28.     }  
  29.     public void MouseDownMover() {  
  30.         if(Input.GetMouseButtonDown(0)) {  
  31.             LayerMask layerMaskPlayers = 1 << LayerMask.NameToLayer("Terrain");  
  32.             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  
  33.             RaycastHit hit;  
  34.             if (Physics.Raycast(ray, out hit,600,layerMaskPlayers.value)) {  
  35.                 point = hit.point;  
  36.                 //Instantiate(clickPont, point, transform.rotation);  
  37.                 TimeRealtimeSinceStartup();  
  38.             }  
  39.         }  
  40.     }  
  41.     public void TimeRealtimeSinceStartup() {  
  42.         if(Time.realtimeSinceStartup - time <=0.2f) {  
  43.             SetGameState(PLAY_RUN);  
  44.         } else {  
  45.             SetGameState(PLAY_WALK);  
  46.         }  
  47.         time = Time.realtimeSinceStartup;  
  48.     }  
  49.     public void FixedUpdate() {  
  50.         switch(gameState) {  
  51.             case PLAY_IDLE:  
  52.                 break;  
  53.             case PLAY_WALK:  
  54.                 SetGameState(PLAY_WALK);  
  55.                 Move(walkSpeed);  
  56.                 break;  
  57.             case PLAY_RUN:  
  58.                 SetGameState(PLAY_RUN);  
  59.                 Move(runSpeed);  
  60.                 break;  
  61.         }  
  62.     }  
  63.     public void SetGameState(int  state) {  
  64.         switch(state) {  
  65.             case PLAY_IDLE:  
  66.                 point = transform.position;  
  67.                 //animation.Play("idle");  
  68.                 break;  
  69.             case PLAY_WALK:  
  70.                 //animation.Play("walk");  
  71.                 break;  
  72.             case PLAY_RUN:  
  73.                 //animation.Play("run");  
  74.                 break;  
  75.         }  
  76.         gameState = state;  
  77.     }  
  78.     public void Move(float speed) {  
  79.         if(Mathf.Abs(Vector3.Distance(point, transform.position))>=0.2f) {  
  80.             moveflag = true;  
  81.             CharacterController controller  = GetComponent<CharacterController>();  
  82.             v = Vector3.ClampMagnitude(point -  transform.position,speed);  
  83.             v.y = 0;  
  84.         } else {  
  85.             moveflag = false;  
  86.             SetGameState(PLAY_IDLE);  
  87.         }  
  88.         moveSpeed = speed;  
  89.     }  
  90.     public bool getmousemoveFlag() {  
  91.         return moveflag;  
  92.     }  
  93.         public void setMouseMoveFlag() {  
  94.         moveflag = false;  
  95.         point = transform.position;  
  96.     }  
  97.     public Vector3 getMovement() {  
  98.         return v;  
  99.     }  
  100.     public float getMoveSpeed() {  
  101.         return moveSpeed;  
  102.     }  
  103. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web 开发基础

一、 Web 开发简介 最早的软件都是运行在大型机上的&#xff0c;软件使用者登陆到大型机上去运行软件。后来随着 PC 机的兴起&#xff0c;软件开始主要运行在桌面上&#xff0c;而数据库这样的软件运行在服务器端&#xff0c;这种 Client/Server 模式简称 CS 架构。随着互联网的…

power bi函数_在Power BI中的行上使用聚合函数

power bi函数Aggregate functions are one of the main building blocks in Power BI. Being used explicitly in measures, or implicitly defined by Power BI, there is no single Power BI report which doesn’t use some sort of aggregate functions.聚合功能是Power BI…

广义估计方程估计方法_广义估计方程简介

广义估计方程估计方法A key assumption underpinning generalized linear models (which linear regression is a type of) is the independence of observations. In longitudinal data this will simply not hold. Observations within an individual (between time points) …

Unity3d鼠标点击屏幕来控制人物的走动

今天呢&#xff0c;我们来一起实现一个在RPG中游戏中十分常见的功能&#xff0c;通过鼠标点击屏幕来控制人物的走动。首先来说一下原理&#xff0c;当我们点击屏幕时&#xff0c;我们按照一定的方法&#xff0c;将屏幕上的二维坐标转化为三维坐标&#xff0c;然后我们从摄像机位…

Java中的ReentrantLock和synchronized两种锁定机制的对比

2019独角兽企业重金招聘Python工程师标准>>> 多线程和并发性并不是什么新内容&#xff0c;但是 Java 语言设计中的创新之一就是&#xff0c;它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类&#xff0c;可以用它…

大数定理 中心极限定理_中心极限定理:直观的遍历

大数定理 中心极限定理One of the most beautiful concepts in statistics and probability is Central Limit Theorem,people often face difficulties in getting a clear understanding of this and the related concepts, I myself struggled understanding this during my…

探索性数据分析(EDA)-不要问如何,不要问什么

数据科学 &#xff0c; 机器学习 (Data Science, Machine Learning) This is part 1 in a series of articles guiding the reader through an entire data science project.这是一系列文章的第1部分 &#xff0c;指导读者完成整个数据科学项目。 I am a new writer on Medium…

IDEA 插件开发入门教程

2019独角兽企业重金招聘Python工程师标准>>> IntelliJ IDEA 是目前最好用的 JAVA 开发 IDE&#xff0c;它本身的功能已经非常强大了&#xff0c;但是每个人的需求不一样&#xff0c;有些需求 IDEA 本身无法满足&#xff0c;于是我们就需要自己开发插件来解决。工欲善…

安卓代码还是xml绘制页面_我们应该绘制实际还是预测,预测还是实际还是无关紧要?

安卓代码还是xml绘制页面Plotting the actual and predicted data is frequently used for visualizing and analyzing how the actual data correlate with those predicted by the model. Ideally, this should correspond to a slope of 1 and an intercept of 0. However, …

Mecanim动画系统

本期教程和大家分享Mecanim动画系统的重定向特性&#xff0c;Mecanim动画系统是Unity3D推出的全新的动画系统&#xff0c;具有重定向、可融合等诸多新特性&#xff0c;通过和美工人员的紧密合作&#xff0c;可以帮助程序设计人员快速地设计出角色动画。一起跟着人气博主秦元培学…

【嵌入式硬件Esp32】Ubuntu 1804下ESP32交叉编译环境搭建

一、ESP32概述EPS32是乐鑫最新推出的集成2.4GWi-Fi和蓝牙双模的单芯片方案&#xff0c;采用台积电(TSMC)超低功耗的40nm工艺&#xff0c;拥有最佳的功耗性能、射频性能、稳定性、通用性和可靠性&#xff0c;适用于多种应用和不同的功耗要求。 ESP32搭载低功耗的Xtensa LX6 32bi…

你认为已经过时的C语言,是如何影响500万程序员的?...

看招聘职位要c语言的占比真不多了&#xff0c;是否c语言真得落伍了&#xff1f; 看一下许多招聘平台有关于找纯粹的c语言开发的占比确实没有很多&#xff0c;都被Java&#xff0c;php&#xff0c;python等等語言刷屏。这对于入门正在学习c语言的小白真他妈就是惊天霹雳&#xf…

云尚制片管理系统_电影制片厂的未来

云尚制片管理系统Data visualization is a key step of any data science project. During the process of exploratory data analysis, visualizing data allows us to locate outliers and identify distribution, helping us to control for possible biases in our data ea…

JAVA单向链表实现

JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构&#xff0c;两者各有优缺点。数组我们知道是在内存上的一块连续的空间构成&#xff0c;所以其元素访问可以通过下标进行&#xff0c;随机访问速度很快&#xff0c;但数组也有其缺点&#xff0c;由于数组的…

201771010102 常惠琢《面向对象程序设计(java)》第八周学习总结

1、实验目的与要求 (1) 掌握接口定义方法&#xff1b; (2) 掌握实现接口类的定义要求&#xff1b; (3) 掌握实现了接口类的使用要求&#xff1b; (4) 掌握程序回调设计模式&#xff1b; (5) 掌握Comparator接口用法&#xff1b; (6) 掌握对象浅层拷贝与深层拷贝方法&#xff1b…

新版 Android 已支持 FIDO2 标准,免密登录应用或网站

谷歌刚刚宣布了与 FIDO 联盟达成的最新合作&#xff0c;为 Android 用户带来了无需密码、即可登录网站或应用的便捷选项。 这项服务基于 FIDO2 标准实现&#xff0c;任何运行 Android 7.0 及后续版本的设备&#xff0c;都可以在升级最新版 Google Play 服务后&#xff0c;通过指…

t-sne原理解释_T-SNE解释-数学与直觉

t-sne原理解释The method of t-distributed Stochastic Neighbor Embedding (t-SNE) is a method for dimensionality reduction, used mainly for visualization of data in 2D and 3D maps. This method can find non-linear connections in the data and therefore it is hi…

Android Studio如何减小APK体积

最近在用AndroidStudio开发一个小计算器&#xff0c;代码加起来还不到200行。但是遇到一个问题&#xff0c;导出的APK文件大小竟然达到了1034K。这不科学&#xff0c;于是就自己动手精简APK。下面我们大家一起学习怎么缩小一个APK的大小&#xff0c;以hello world为例。 新建工…

js合并同类数组里面的对象_通过同类群组保留估算客户生命周期价值

js合并同类数组里面的对象This is Part I of the two-part series dedicated to estimating customer lifetime value. In this post, I will describe how to estimate LTV, on a conceptual level, in order to explain what we’re going to be doing in Part II with the P…

C#解析HTML

第一种方法&#xff1a;用正则表达式来分析 [csharp] view plaincopy 转自网上的一个实例&#xff1a;所有的href都抽取出来&#xff1a; using System; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace HttpGet { c…