從官方的範例裡面抽出來的程式
還沒有改完成,但可以參考,程式複雜已失去重力,所以腳色不會掉落
直接拖曳到物件上就可以使用,但必須先設定角色碰撞
@script RequireComponent(Rigidbody) public var movementDirection : Vector3 = Vector3(1,0,0); public var movementTarget : Vector3; public var facingDirection : Vector3; public var walkingSpeed: float = 5.0; public var walkingSnappyness: float = 50; //走路的節拍 public var turningSmoothing: float = 0.3; //平滑轉動 private var character: Transform; public var cursorPlaneHeight: float = 0; private var mainCamera: Camera; private var mainCameraTransform: Transform; private var playerMovementPlane: Plane; private var screenMovementSpace: Quaternion; private var screenMovementForward: Vector3; private var screenMovementRight: Vector3; function Awake() { movementDirection = Vector2.zero; facingDirection = Vector2.zero; mainCamera = Camera.main; mainCameraTransform = mainCamera.transform; if (!character) character = transform; playerMovementPlane = new Plane(character.up, character.position + character.up * cursorPlaneHeight); } function Start() { screenMovementSpace = Quaternion.Euler(0, mainCameraTransform.eulerAngles.y, 0); screenMovementForward = screenMovementSpace * Vector3.forward; screenMovementRight = screenMovementSpace * Vector3.right; } function Update() { movementDirection = Input.GetAxis("Horizontal") * screenMovementRight + Input.GetAxis("Vertical") * screenMovementForward; if (movementDirection.sqrMagnitude > 1) movementDirection.Normalize(); playerMovementPlane.normal = character.up; playerMovementPlane.distance = -character.position.y + cursorPlaneHeight; var cameraAdjustmentVector: Vector3 = Vector3.zero; cameraAdjustmentVector = facingDirection; var cursorWorldPosition: Vector3 = ScreenPointToWorldPointOnPlane(Input.mousePosition, playerMovementPlane, mainCamera); facingDirection = (cursorWorldPosition - character.position); facingDirection.y = 0; } public static function PlaneRayIntersection(plane: Plane, ray: Ray): Vector3 { var dist: float; plane.Raycast(ray, dist); return ray.GetPoint(dist); } public static function ScreenPointToWorldPointOnPlane(screenPoint: Vector3, plane: Plane, camera: Camera): Vector3 { var ray: Ray = camera.ScreenPointToRay(screenPoint); return PlaneRayIntersection(plane, ray); } function FixedUpdate() { // Handle the movement of the character var targetVelocity: Vector3 = movementDirection * walkingSpeed; var deltaVelocity: Vector3 = targetVelocity - rigidbody.velocity; if (rigidbody.useGravity) deltaVelocity.y = 0; rigidbody.AddForce(deltaVelocity * walkingSnappyness, ForceMode.Acceleration); // 設定玩家面對的方向,或如果是零,則(面對)運動方向 var faceDir: Vector3 = facingDirection; if (faceDir == Vector3.zero) faceDir = movementDirection; // 使人物轉動朝著目標的旋轉 if (faceDir == Vector3.zero) { rigidbody.angularVelocity = Vector3.zero; } else { var rotationAngle: float = AngleAroundAxis(transform.forward, faceDir, Vector3.up); rigidbody.angularVelocity = (Vector3.up * rotationAngle * turningSmoothing); } } // The angle between dirA and dirB around axis static function AngleAroundAxis(dirA: Vector3, dirB: Vector3, axis: Vector3) { // Project A and B onto the plane orthogonal target axis dirA = dirA - Vector3.Project(dirA, axis); dirB = dirB - Vector3.Project(dirB, axis); // Find (positive) angle between A and B var angle: float = Vector3.Angle(dirA, dirB); // Return angle multiplied with 1 or -1 return angle * (Vector3.Dot(axis, Vector3.Cross(dirA, dirB)) < 0 ? -1 : 1); }
0 ♥:
張貼留言