您的位置:首页 > 其它

鼠标点击地面人物自动走动(也包含按键wasd&space控制)

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

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



一、效果图



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

二、大概步骤

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

[csharp] view
plaincopyprint?





void Update () {

MouseDownMover();

}

public void MouseDownMover() {

if(Input.GetMouseButtonDown(0)) { //如果左击

LayerMask layerMaskPlayers = 1 << LayerMask.NameToLayer("Terrain");

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit hit;

if (Physics.Raycast(ray, out hit,600,layerMaskPlayers.value)) {

point = hit.point;

Instantiate(clickPont, point, transform.rotation);

TimeRealtimeSinceStartup();

}

}

}

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





1.ThirdPersonCamera(相当于smoothflow)

[plain] view
plaincopyprint?





/*

Perfect Camera Control Script By zhoy;

Which can be toggled between First-Person Look And Third-Person Look

And it also realised freely Look-around the world with mouse move

*/

var cameraTransform : Transform;

var distance = 7.0;

var xSpeed = 100;

var ySpeed = 100;

var mSpeed = 10;

var angularSmoothLag = 0.3;

var angularMaxSpeed = 15.0;

var snapSmoothLag = 0.2;

var snapMaxSpeed = 720.0;

var clampHeadPositionScreenSpace = 0.75;

private var _target : Transform;

//var secondCamera : Camera;

private var mainCamera : Camera;

private var controller : ThirdPersonController;

private var headOffset = Vector3.zero;

private var centerOffset = Vector3.zero;

private var dosnap = false;

private var snapped = false;

private var firstPersonLook = false;

private var angleVelocity = 0.0;

private var minAngleY = -45;

private var yTopLimit = -20.0;

private var yMinLimit = -45;

private var yMaxLimit = 45;

private var minDistance = 1.2;

private var maxDistance = 3.5;

private var current_ver_angle = 0.0;

private var current_hor_angle = 0.0;

private var look_height = 0.0;

private var bSeePicture = false;

private var curPicturePos:Vector3;

private var curPictureRotation:Quaternion;

private var curPictureTran: Transform;

function Awake ()

{

//secondCamera.enabled = false;

mainCamera = Camera.main;

cameraTransform = GameObject.Find("Main Camera").transform;

if(!cameraTransform && mainCamera)

{

cameraTransform = mainCamera.transform;

}

if(!cameraTransform)

{

Debug.Log("Please assign a camera to the ThirdPersonCamera script.");

enabled = false;

}

_target = transform;

if (_target)

{

controller = _target.GetComponent(ThirdPersonController);

}

if (controller)

{

var characterController : CharacterController = _target.collider;

centerOffset = characterController.bounds.center - _target.position;

headOffset = centerOffset;

var look_target = _target.Find("LookTarget");

//Debug.Log(look_target);

var head_back_pos = characterController.bounds.max;

if(look_target)

{

head_back_pos = look_target.transform.position;

}

var hit_test : RaycastHit;

var head_top = characterController.bounds.center;

head_top.y = characterController.bounds.min.y;

if(Physics.Raycast(head_top,Vector3.down,hit_test,50))

{

look_height = head_back_pos.y - hit_test.point.y;

}

//Debug.Log("look_height : " + look_height);

headOffset.y = head_back_pos.y - _target.position.y;

/*下面计算、保存 相机稳定后 的初始位置与方位*/

var hor_angle = _target.eulerAngles.y;

var rotation_h = Quaternion.Euler (0, hor_angle, 0);

var camera_pos = head_back_pos;

camera_pos += rotation_h * Vector3.back * distance; /*计算相机位置是用 头部为球中心计算的*/

var offsetToCenter = head_back_pos - camera_pos;

var rotation = Quaternion.LookRotation(Vector3(offsetToCenter.x, offsetToCenter.y, offsetToCenter.z));

current_hor_angle = 360 - rotation.eulerAngles.y;

current_ver_angle = rotation.eulerAngles.x;

}

else

{

Debug.Log("Please assign a target to the camera that has a ThirdPersonController script attached.");

}

Cut(_target, centerOffset);

}

function SetVisible(visible)

{

var renderers = gameObject.GetComponentsInChildren(Renderer);

if(visible)

{

for(var rend:Renderer in renderers){

rend.enabled = true;

}

firstPersonLook = false;

}

else

{

for(var rend:Renderer in renderers)

{

rend.enabled = false;

}

firstPersonLook = true;

}

}

function Cut (dummyTarget : Transform, dummyCenter : Vector3)

{

var oldSnapMaxSpeed = snapMaxSpeed;

var oldSnapSmooth = snapSmoothLag;

snapMaxSpeed = 10000;

snapSmoothLag = 0.001;

dosnap = true;

Apply (transform, Vector3.zero);

snapMaxSpeed = oldSnapMaxSpeed;

snapSmoothLag = oldSnapSmooth;

}

function DebugDrawStuff ()

{

Debug.DrawLine(_target.position, _target.position + headOffset);

}

function AngleDistance (a : float, b : float)

{

a = Mathf.Repeat(a, 360);

b = Mathf.Repeat(b, 360);

return Mathf.Abs(b - a);

}

function Apply (dummyTarget : Transform, dummyCenter : Vector3)

{

// Early out if we don't have a target

if (!controller)

{

return;

}

var needGoOn = false;

var targetCenter = _target.position + centerOffset;

var targetHead = _target.position + headOffset;

var strength = Input.GetAxis("Mouse ScrollWheel");

if(strength != 0)

{

distance -= strength*mSpeed;

distance = Mathf.Clamp(distance, minDistance, maxDistance);

/*

if(distance <= 1)

{

SetVisible(false);

minAngleY = -80;

}

else if(firstPersonLook)

{

SetVisible(true);

}

else if(distance < look_height)

{

minAngleY = (distance - 2) * (yTopLimit - yMinLimit)/(look_height - 2) - yTopLimit;

minAngleY = - minAngleY;

}

else

{

minAngleY = yMinLimit;

}

*/

needGoOn = true;

}

var originalTargetAngle = 360 - _target.eulerAngles.y;

current_hor_angle = 360 - cameraTransform.eulerAngles.y;

if(!snapped)

{

var targetAngle = originalTargetAngle;

var dis_angle = 0;

if (dosnap)

{

dis_angle = AngleDistance (360 - current_hor_angle, originalTargetAngle);

current_hor_angle = Mathf.SmoothDampAngle(current_hor_angle, targetAngle, angleVelocity, snapSmoothLag, snapMaxSpeed);

}

// We are close to the target, so we can stop snapping now!

dis_angle= 0;

if (dis_angle <= 13)

{

snapped = true;

dosnap = false;

}

else if(dis_angle < 3)

{

dosnap = false;

}

if(!snapped && !dosnap)

{

current_hor_angle = Mathf.SmoothDampAngle(current_hor_angle, targetAngle, angleVelocity, angularSmoothLag, angularMaxSpeed);

}

needGoOn = true;

}

else

{

var rotation_h =0;

var rotation_v =0;

if (Input.GetMouseButton(1)) {

rotation_h = -Input.GetAxis("Mouse X") * xSpeed *0.02;

rotation_v = -Input.GetAxis("Mouse Y") * ySpeed *0.02;

}

needGoOn = needGoOn || (rotation_h != 0 || rotation_v != 0);

current_hor_angle += rotation_h;

current_hor_angle = Mathf.Repeat(current_hor_angle, 360);

current_ver_angle += rotation_v;

current_ver_angle = Mathf.Clamp (current_ver_angle, minAngleY, yMaxLimit);

}

needGoOn = needGoOn || controller.IsMoving();

needGoOn = needGoOn || controller.IsJumping();

if(!needGoOn)/*没有鼠标键盘事件,返回即可,相机一般不会自动更新。除非未来有其他情形,那时候再添加*/

{

var mousecl = GetComponent("mouseMoveContr");

var mouseMoveFlag = mousecl.getmousemoveFlag();

if (!mouseMoveFlag) {

return;

}

}

var rad_angle_h = (current_hor_angle - 90.0)*Mathf.Deg2Rad;

var rad_angle_v = current_ver_angle*Mathf.Deg2Rad;

var camera_pos = Vector3.zero;

var radius_hor = distance*Mathf.Cos(rad_angle_v);

var slope = -Mathf.Sin(rad_angle_v);

camera_pos.x = radius_hor*Mathf.Cos(rad_angle_h) + targetHead.x;/*计算相机位置是用 头部为球中心计算的*/

camera_pos.z = radius_hor*Mathf.Sin(rad_angle_h) + targetHead.z;

camera_pos.y = -distance*slope + targetHead.y;

if(camera_pos.y < targetHead.y - look_height)

{

camera_pos.y = targetHead.y - look_height;

}

var hit : RaycastHit;

var modified = false;

var hor_dis = 0.0;

if(camera_pos.y < targetCenter.y)

{

var testPt = camera_pos;

testPt.y = targetCenter.y;

if(Physics.Raycast(testPt,Vector3.down,hit,50))/*这个检测必须进行,不能完全指望后面的检测,否则会有微小的显示问题。一般发生在摄像机贴近地面跑动时*/

{

if(camera_pos.y < hit.point.y + 0.5)/*偏移0.5.防止过于接近地面,并且在地面上面的情况,会因为摄像机近截面问题。导致显示地下的内容*/

{

modified = true;

}

}

}

if(modified)

{

hor_dis = Vector3.Distance(targetCenter,Vector3(camera_pos.x,targetCenter.y,camera_pos.z));

camera_pos = hit.point;

camera_pos.y = (slope > 0.95)?hit.point.y:(camera_pos.y + hor_dis/maxDistance);

//摄像头在脚下的时候,hor_dis几乎为0

modified = false;

//Debug.Log("hit down.....camera_pos : " +camera_pos);

}

var real_dis = Vector3.Distance(targetCenter,camera_pos);

var direction = camera_pos - targetCenter;

if(Physics.Raycast(targetCenter,direction,hit,real_dis) && hit.collider.gameObject != gameObject)

{

// modified = false;

// if(hit.collider.bounds.size.magnitude <= 15) {

// modified = false;

// } else if (hit.collider.gameObject.tag == "bridge") {

// camera_pos.y = camera_pos.y + 2.5;

// } else if (hit.collider.gameObject.tag == "through"){

// modified = false;

// } else {

// modified = true;

// }

// Debug.LogError(hit.point.y < targetHead.y);

camera_pos = hit.point;

if(hit.point.y < targetHead.y){

camera_pos.y = targetHead.y;

// Debug.LogError(camera_pos);

}

}

//

// if(modified)

// {

// hor_dis = Vector3.Distance(targetCenter,Vector3(camera_pos.x,targetCenter.y,camera_pos.z));

// camera_pos = hit.point;

// camera_pos.y = (slope > 0.95)?hit.point.y:(camera_pos.y + hor_dis/maxDistance);/*摄像头在脚下的时候,hor_dis几乎为0*/

// }

cameraTransform.position = camera_pos;

var offsetToCenter = targetHead - cameraTransform.position;

cameraTransform.rotation = Quaternion.LookRotation(Vector3(offsetToCenter.x, offsetToCenter.y, offsetToCenter.z));

Debug.DrawLine(targetCenter, camera_pos, Color.red);

}

function EventMouseClicked(){

// Debug.LogError(Input.mousePosition);

var mousePos:Vector3 = Input.mousePosition;

var ray:Ray;

ray = Camera.main.ScreenPointToRay(mousePos);

var hitInfo:RaycastHit;

var cameraTran:Transform;

cameraTran = Camera.main.transform;

if(Input.GetMouseButtonDown(0)){

if(Physics.Raycast(ray, hitInfo, 50f, (1<<9))){

Debug.LogError(hitInfo.transform.gameObject.layer);

// curPicturePos = hitInfo.point;

// curPicturePos = hitInfo.transform.Find("CameraPos").position;

// curPictureRotation = hitInfo.transform.Find("CameraPos").rotation;

curPictureTran = hitInfo.transform.Find("CameraPos");

bSeePicture = !bSeePicture;

if(bSeePicture){

GetComponent(ThirdPersonController).enabled = false;

}else{

GetComponent(ThirdPersonController).enabled = true;

}

}

}

}

function LateUpdate ()

{

if (Input.GetKeyUp (KeyCode.Tab))

{

var hit2 : RaycastHit;

Debug.Log("Camera Pos.y : " + cameraTransform.position.y);

var testPt = cameraTransform.position;

testPt.y = 50;

if(Physics.Raycast(testPt,Vector3.down,hit2,50))

{

Debug.Log("hit2.point.y : " + hit2.point.y);

}

}

EventMouseClicked();

if(!bSeePicture){

Apply (transform, Vector3.zero);

}else{

// Camera.main.transform.position = transform.position;

// Camera.main.transform.position.y = curPicturePos.y;

//// Camera.main.transform.rotation = Quaternion.LookRotation(curPicturePos - Camera.main.transform.position);

// Camera.main.transform.rotation = transform.rotation;

// Camera.main.transform.position = curPicturePos;

// Camera.main.transform.rotation = curPictureRotation;

Camera.main.transform.rotation = curPictureTran.rotation;

Camera.main.transform.position = curPictureTran.position;

}

}

function GetCenterOffset ()

{

return centerOffset;

}

/*

function UpdateSecondCamPos(lookat,campos)

{

var ccnter = Vector3.Lerp(campos,lookat,0.5);

var forward = ccnter - campos;

forward = forward.normalized;

forward.y = 0;

var right = Vector3.Cross (Vector3.up, forward);

var setpos = ccnter + right*30;

secondCamera.transform.position = setpos;

var offset = ccnter - setpos;

//Debug.DrawRay(campos,lookat - campos,Color.red,100000);

var t1 = Time.time;

GameObject.Find("TestObject").transform.position = campos;

var t2= Time.time;

secondCamera.transform.rotation = Quaternion.LookRotation(Vector3(offset.x, offset.y, offset.z));

}

*/

/*

if (Input.GetKeyUp (KeyCode.Tab))

{

var hit2 : RaycastHit;

Debug.Log("Camera Pos.y : " + cameraTransform.position.y);

var testPt = cameraTransform.position;

testPt.y = 50;

if(Physics.Raycast(testPt,Vector3.down,hit2,50))

{

Debug.Log("hit2.point.y : " + hit2.point.y);

}

if(mainCamera.enabled)

{

controller.SwitchCamera(secondCamera);

}

else

{

controller.SwitchCamera(mainCamera);

}

}

*/

2.ThirdPersonController(修改版)

[plain] view
plaincopyprint?





// Require a character controller to be attached to the same game object

@script RequireComponent(CharacterController)

public var idleAnimation : AnimationClip;

public var walkAnimation : AnimationClip;

public var runAnimation : AnimationClip;

public var jumpPoseAnimation : AnimationClip;

public var kneeAnimation : AnimationClip;

public var walkMaxAnimationSpeed : float = 0.75;

public var trotMaxAnimationSpeed : float = 1.0;

public var runMaxAnimationSpeed : float = 1.0;

public var jumpAnimationSpeed : float = 1.15;

public var landAnimationSpeed : float = 1.0;

private var _animation : Animation;

enum CharacterState {

Idle = 0,

Walking = 1,

Trotting = 2,

Running = 3,

Jumping = 4,

}

private var _characterState : CharacterState;

// The speed when walking

var walkSpeed = 2.0;

// after trotAfterSeconds of walking we trot with trotSpeed

var trotSpeed = 4.0;

// when pressing "Fire3" button (cmd) we start running

var runSpeed = 6.0;

var inAirControlAcceleration = 3.0;

// How high do we jump when pressing jump and letting go immediately

var jumpHeight = 0.5;

// The gravity for the character

var gravity = 20.0;

// The gravity in controlled descent mode

var speedSmoothing = 10.0;

var rotateSpeed = 500.0;

var trotAfterSeconds = 3.0;

var canJump = true;

private var jumpRepeatTime = 0.05;

private var jumpTimeout = 0.15;

private var groundedTimeout = 0.25;

// The camera doesnt start following the target immediately but waits for a split second to avoid too much waving around.

private var lockCameraTimer = 0.0;

// The current move direction in x-z

private var moveDirection = Vector3.zero;

// The current vertical speed

private var verticalSpeed = 0.0;

// The current x-z move speed

private var moveSpeed = 0.0;

// The last collision flags returned from controller.Move

private var collisionFlags : CollisionFlags;

// Are we jumping? (Initiated with jump button and not grounded yet)

private var jumping = false;

private var jumpingReachedApex = false;

// Are we moving backwards (This locks the camera to not do a 180 degree spin)

private var movingBack = false;

// Is the user pressing any keys?

private var isMoving = false;

// When did the user start walking (Used for going into trot after a while)

private var walkTimeStart = 0.0;

// Last time the jump button was clicked down

private var lastJumpButtonTime = -10.0;

// Last time we performed a jump

private var lastJumpTime = -1.0;

// the height we jumped from (Used to determine for how long to apply extra jump power after jumping.)

private var lastJumpStartHeight = 0.0;

private var inAirVelocity = Vector3.zero;

private var lastGroundedTime = 0.0;

private var isControllable = true;

private var activeCamera : Camera;

//private var scenesCode = "S";

function Start() {

//scenesCode = GameObject.Find("Main Camera").GetComponent("createusers").getScenesCode();

}

function LateUpdate() {

}

function Awake ()

{

moveDirection = transform.TransformDirection(Vector3.forward);

_animation = GetComponent(Animation);

if(!_animation)

Debug.Log("The character you would like to control doesn't have animations. Moving her might look weird.");

/*

public var idleAnimation : AnimationClip;

public var walkAnimation : AnimationClip;

public var runAnimation : AnimationClip;

public var jumpPoseAnimation : AnimationClip;

*/

if(!idleAnimation) {

_animation = null;

Debug.Log("No idle animation found. Turning off animations.");

}

if(!walkAnimation) {

_animation = null;

Debug.Log("No walk animation found. Turning off animations.");

}

if(!runAnimation) {

_animation = null;

Debug.Log("No run animation found. Turning off animations.");

}

if(!jumpPoseAnimation && canJump) {

_animation = null;

Debug.Log("No jump animation found and the character has canJump enabled. Turning off animations.");

}

activeCamera = Camera.main;

Screen.lockCursor = false;

}

/*

function SwitchCamera(camera:Camera)

{

activeCamera.enabled = false;

activeCamera = camera;

activeCamera.enabled = true;

}

*/

function UpdateSmoothedMovementDirection ()

{

var cameraTransform = activeCamera.transform;

var grounded = IsGrounded();

// Forward vector relative to the camera along the x-z plane

var forward = cameraTransform.TransformDirection(Vector3.forward);

forward.y = 0;

forward = forward.normalized;

// Right vector relative to the camera

// Always orthogonal to the forward vector

var right = Vector3(forward.z, 0, -forward.x);

var v = Input.GetAxisRaw("Vertical");

var h = Input.GetAxisRaw("Horizontal");

// Are we moving backwards or looking backwards

if (v < -0.2)

movingBack = true;

else

movingBack = false;

var wasMoving = isMoving;

isMoving = Mathf.Abs (h) > 0.1 || Mathf.Abs (v) > 0.1;

// Target direction relative to the camera

var targetDirection = h * right + v * forward;

// Grounded controls

if (grounded)

{

// Lock camera for short period when transitioning moving & standing still

lockCameraTimer += Time.deltaTime;

if (isMoving != wasMoving)

lockCameraTimer = 0.0;

// We store speed and direction seperately,

// so that when the character stands still we still have a valid forward direction

// moveDirection is always normalized, and we only update it if there is user input.

if (targetDirection != Vector3.zero)

{

// If we are really slow, just snap to the target direction

if (moveSpeed < walkSpeed * 0.9 && grounded)

{

moveDirection = targetDirection.normalized;

}

// Otherwise smoothly turn towards it

else

{

moveDirection = Vector3.RotateTowards(moveDirection, targetDirection, rotateSpeed * Mathf.Deg2Rad * Time.deltaTime, 1000);

moveDirection = moveDirection.normalized;

}

}

// Smooth the speed based on the current target direction

var curSmooth = speedSmoothing * Time.deltaTime;

// Choose target speed

//* We want to support analog input but make sure you cant walk faster diagonally than just forward or sideways

var targetSpeed = Mathf.Min(targetDirection.magnitude, 1.0);

_characterState = CharacterState.Idle;

// Pick speed modifier

if (Input.GetKey (KeyCode.LeftShift) || Input.GetKey (KeyCode.RightShift))

{

targetSpeed *= runSpeed;

_characterState = CharacterState.Running;

}

else if (Time.time - trotAfterSeconds > walkTimeStart)

{

targetSpeed *= trotSpeed;

_characterState = CharacterState.Trotting;

}

else

{

targetSpeed *= walkSpeed;

_characterState = CharacterState.Walking;

}

moveSpeed = Mathf.Lerp(moveSpeed, targetSpeed, curSmooth);

// Reset walk time start when we slow down

if (moveSpeed < walkSpeed * 0.3)

walkTimeStart = Time.time;

}

// In air controls

else

{

// Lock camera while in air

if (jumping)

lockCameraTimer = 0.0;

if (isMoving)

inAirVelocity += targetDirection.normalized * Time.deltaTime * inAirControlAcceleration;

}

}

function ApplyJumping ()

{

// Prevent jumping too fast after each other

if (lastJumpTime + jumpRepeatTime > Time.time)

return;

if (IsGrounded())

{

// Jump

// - Only when pressing the button down

// - With a timeout so you can press the button slightly before landing

if (canJump && Time.time < lastJumpButtonTime + jumpTimeout) {

verticalSpeed = CalculateJumpVerticalSpeed (jumpHeight);

SendMessage("DidJump", SendMessageOptions.DontRequireReceiver);

}

}

}

function ApplyGravity ()

{

if (isControllable) // don't move player at all if not controllable.

{

// Apply gravity

var jumpButton = Input.GetButton("Jump");

// When we reach the apex of the jump we send out a message

if (jumping && !jumpingReachedApex && verticalSpeed <= 0.0)

{

jumpingReachedApex = true;

SendMessage("DidJumpReachApex", SendMessageOptions.DontRequireReceiver);

}

if (IsGrounded ())

verticalSpeed = 0.0;

else

verticalSpeed -= gravity * Time.deltaTime;

}

}

function CalculateJumpVerticalSpeed (targetJumpHeight : float)

{

// From the jump height and gravity we deduce the upwards speed

// for the character to reach at the apex.

return Mathf.Sqrt(2 * targetJumpHeight * gravity);

}

function DidJump ()

{

jumping = true;

jumpingReachedApex = false;

lastJumpTime = Time.time;

lastJumpStartHeight = transform.position.y;

lastJumpButtonTime = -10;

_characterState = CharacterState.Jumping;

}

function Update() {

if (_animation.IsPlaying("kneel")) {

return;

}

if (!isControllable)

{

// kill all inputs if not controllable.

Input.ResetInputAxes();

}

if (Input.GetButtonDown ("Jump") && !jumping)

{

lastJumpButtonTime = Time.time;

}

if (Input.GetKeyUp (KeyCode.Escape))

{

Screen.lockCursor = !Screen.lockCursor;

}

UpdateSmoothedMovementDirection();

// Apply gravity

// - extra power jump modifies gravity

// - controlledDescent mode modifies gravity

ApplyGravity ();

// Apply jumping logic

ApplyJumping ();

//鼠标移动

var mousecl = GetComponent("mouseMoveContr");

var mouseMoveFlag = mousecl.getmousemoveFlag();

if (mouseMoveFlag){

if (checkKeyDown()) {

mousecl.setMouseMoveFlag();

} else {

moveDirection = mousecl.getMovement();

moveSpeed = mousecl.getMoveSpeed();

if (moveSpeed == 4.2) {

_characterState = CharacterState.Running;

}

}

}

// Calculate actual motion

var movement = moveDirection * moveSpeed + Vector3 (0, verticalSpeed, 0) + inAirVelocity;

movement *= Time.deltaTime;

// Move the controller

var controller : CharacterController = GetComponent(CharacterController);

collisionFlags = controller.Move(movement);

if (_characterState == CharacterState.Running) {

if (mouseMoveFlag){

if(controller.velocity.sqrMagnitude < 100) {

_characterState = CharacterState.Walking;

}

}

}

// ANIMATION sector

if(_animation) {

if(_characterState == CharacterState.Jumping)

{

if(!jumpingReachedApex) {

_animation[jumpPoseAnimation.name].speed = jumpAnimationSpeed;

_animation[jumpPoseAnimation.name].wrapMode = WrapMode.ClampForever;

_animation.CrossFade(jumpPoseAnimation.name);

} else {

_animation[jumpPoseAnimation.name].speed = -landAnimationSpeed;

_animation[jumpPoseAnimation.name].wrapMode = WrapMode.ClampForever;

_animation.CrossFade(jumpPoseAnimation.name);

}

}

else

{

if(controller.velocity.sqrMagnitude < 0.1) {

_animation.CrossFade(idleAnimation.name);

}

else

{

if(_characterState == CharacterState.Running) {

_animation[runAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, runMaxAnimationSpeed);

_animation.CrossFade(runAnimation.name);

}

else if(_characterState == CharacterState.Trotting) {

_animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, trotMaxAnimationSpeed);

_animation.CrossFade(walkAnimation.name);

}

else if(_characterState == CharacterState.Walking) {

_animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, walkMaxAnimationSpeed);

_animation.CrossFade(walkAnimation.name);

}

}

}

}

// ANIMATION sector

// Set rotation to the move direction

if (IsGrounded())

{

transform.rotation = Quaternion.LookRotation(moveDirection);

}

else

{

var xzMove = movement;

xzMove.y = 0;

if (xzMove.sqrMagnitude > 0.001)

{

transform.rotation = Quaternion.LookRotation(xzMove);

}

}

// We are in jump mode but just became grounded

if (IsGrounded())

{

lastGroundedTime = Time.time;

inAirVelocity = Vector3.zero;

if (jumping)

{

jumping = false;

SendMessage("DidLand", SendMessageOptions.DontRequireReceiver);

}

}

}

function OnControllerColliderHit (hit : ControllerColliderHit )

{

// Debug.DrawRay(hit.point, hit.normal);

if (hit.moveDirection.y > 0.01)

return;

}

function GetSpeed () {

return moveSpeed;

}

function IsJumping () {

return jumping;

}

function IsGrounded () {

return (collisionFlags & CollisionFlags.CollidedBelow) != 0;

}

function GetDirection () {

return moveDirection;

}

function IsMovingBackwards () {

return movingBack;

}

function GetLockCameraTimer ()

{

return lockCameraTimer;

}

function GetCharacterState() :CharacterState

{

return _characterState;

}

function IsMoving () : boolean

{

return Mathf.Abs(Input.GetAxisRaw("Vertical")) + Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5;

}

function HasJumpReachedApex ()

{

return jumpingReachedApex;

}

function IsGroundedWithTimeout ()

{

return lastGroundedTime + groundedTimeout > Time.time;

}

function Reset ()

{

gameObject.tag = "Player";

}

function checkKeyDown():boolean {

if (Input.GetKey(KeyCode.W)) {

return true;

}

if (Input.GetKey(KeyCode.A)) {

return true;

}

if (Input.GetKey(KeyCode.S)) {

return true;

}

if (Input.GetKey(KeyCode.D)) {

return true;

}

if (Input.GetKey(KeyCode.UpArrow)) {

return true;

}

if (Input.GetKey(KeyCode.DownArrow)) {

return true;

}

if (Input.GetKey(KeyCode.RightArrow)) {

return true;

}

if (Input.GetKey(KeyCode.LeftArrow)) {

return true;

}

return false;

}

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

[csharp] view
plaincopyprint?





using UnityEngine;

using System.Collections;

public class mouseMoveContr : MonoBehaviour {

public const int PLAY_IDLE = 0;

public const int PLAY_WALK = 1;

public const int PLAY_RUN = 2;

public const int PLAY_KNEE = 3;

//public GameObject clickPont;

public float walkSpeed = 2;

public float runSpeed = 4.5f;

private bool moveflag = false;

private int gameState = 0;

private Vector3 point;

private float time;

private Vector3 v;

private Vector3 lotav;

private float moveSpeed = 0.0f;

void Start () {

SetGameState(PLAY_IDLE);

}

void Update () {

MouseDownMover();

}

public void MouseDownMover() {

if(Input.GetMouseButtonDown(0)) {

LayerMask layerMaskPlayers = 1 << LayerMask.NameToLayer("Terrain");

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit hit;

if (Physics.Raycast(ray, out hit,600,layerMaskPlayers.value)) {

point = hit.point;

//Instantiate(clickPont, point, transform.rotation);

TimeRealtimeSinceStartup();

}

}

}

public void TimeRealtimeSinceStartup() {

if(Time.realtimeSinceStartup - time <=0.2f) {

SetGameState(PLAY_RUN);

} else {

SetGameState(PLAY_WALK);

}

time = Time.realtimeSinceStartup;

}

public void FixedUpdate() {

switch(gameState) {

case PLAY_IDLE:

break;

case PLAY_WALK:

SetGameState(PLAY_WALK);

Move(walkSpeed);

break;

case PLAY_RUN:

SetGameState(PLAY_RUN);

Move(runSpeed);

break;

}

}

public void SetGameState(int state) {

switch(state) {

case PLAY_IDLE:

point = transform.position;

//animation.Play("idle");

break;

case PLAY_WALK:

//animation.Play("walk");

break;

case PLAY_RUN:

//animation.Play("run");

break;

}

gameState = state;

}

public void Move(float speed) {

if(Mathf.Abs(Vector3.Distance(point, transform.position))>=0.2f) {

moveflag = true;

CharacterController controller = GetComponent<CharacterController>();

v = Vector3.ClampMagnitude(point - transform.position,speed);

v.y = 0;

} else {

moveflag = false;

SetGameState(PLAY_IDLE);

}

moveSpeed = speed;

}

public bool getmousemoveFlag() {

return moveflag;

}

public void setMouseMoveFlag() {

moveflag = false;

point = transform.position;

}

public Vector3 getMovement() {

return v;

}

public float getMoveSpeed() {

return moveSpeed;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: