Вот скрипт примитивного движения:
FPSWalker.js из стандартного пакета.
var speed = 6.0; var jumpSpeed = 8.0; var gravity = 20.0; private var moveDirection = Vector3.zero; private var grounded : boolean = false; function FixedUpdate() { if (grounded) { // We are grounded, so recalculate movedirection directly from axes moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; if (Input.GetButton ("Jump")) { moveDirection.y = jumpSpeed; } } // Apply gravity moveDirection.y -= gravity * Time.deltaTime; // Move the controller var controller : CharacterController = GetComponent(CharacterController); var flags = controller.Move(moveDirection * Time.deltaTime); grounded = (flags & CollisionFlags.CollidedBelow) != 0; } @script RequireComponent(CharacterController)
Вот переработанный скрипт
// передвижение персонажа using UnityEngine; using System.Collections; [RequireComponent (typeof(CharacterController))] public class CharacterWalker : MonoBehaviour { public float currentSpeed = 6.0f; // рабочая скорость. Дальше скорости — бег, ходьба, приседание public float runSpeed = 15.0f; public float walkSpeed = 6.0f; public float crouchSpeed = 2.5f; public float jumpHeight = 8.0f; // высота прыжка public float gravityPower = 20.0f; // скорость свободного падения public Vector3 moveDirection = new Vector3(0, 0, 0); // направление движения bool allowJump = true; //возможность прыжка float FPCCameraPositionY = 0f; // позиция камеры, нужна для приседаний float FPCCameraPositionX = 0f; float FPCCameraPositionZ = 0f; float conrollerHeight = 0f; // размер и позиция контроллера, нужно для приседаний float conrollerRadius = 0f; float FPCPositionY = 0f; CharacterStatus scriptCharacterStatus; CharacterController controllerC; GameObject FPCCamera; void Awake() { controllerC = GetComponent(typeof(CharacterController)) as CharacterController; scriptCharacterStatus = GetComponent(typeof(CharacterStatus)) as CharacterStatus; // гравитация будет симулироваться иным способом. freezeRotation — нам не нужно, чтобы персонаж падал от любого столкновения rigidbody.freezeRotation = true; rigidbody.useGravity = false; // инициализируем пространственные свойства камеры и персонажа FPCCamera = GameObject.Find ("Main Camera"); FPCCameraPositionY = FPCCamera.transform.localPosition.y; FPCCameraPositionX = FPCCamera.transform.localPosition.x; FPCCameraPositionZ = FPCCamera.transform.localPosition.z; conrollerHeight = controllerC.height; conrollerRadius = controllerC.radius; } void Update() { if (controllerC.isGrounded) // если персонаж стоит на земле { // определяем вектор движения, исходя из ввода с осей moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= currentSpeed; // прыжок — просто поднимаем объект if (Input.GetButton("Jump") && allowJump == true) { moveDirection.y = jumpHeight; } // приседание. Уменьшаем высоту контроллера, опускаем камеру, уменьшаем скорость, запрещаем прыжок if (Input.GetKey("left ctrl")) { FPCCamera.transform.localPosition = new Vector3 (FPCCameraPositionX, FPCCameraPositionY / 2, FPCCameraPositionZ + 0.1f); controllerC.height = conrollerHeight / 2; controllerC.radius = conrollerRadius * 1.2f; FPCPositionY = transform.position.y; allowJump = false; currentSpeed = crouchSpeed; } // возвращаем всё обратно if (Input.GetKeyUp("left ctrl")) { FPCCamera.transform.localPosition = new Vector3 (FPCCameraPositionX, FPCCameraPositionY, FPCCameraPositionZ); transform.position = new Vector3(transform.position.x, FPCPositionY + 0.6f, transform.position.z); controllerC.height = conrollerHeight; controllerC.radius = conrollerRadius; allowJump = true; currentSpeed = walkSpeed; } // бег — увеличиваем скорость, отправляем сообщения о накоплении усталости в CharacterStatus. Условие — наличие очков энергии. if (Input.GetKey("left shift")) { if (scriptCharacterStatus.stamina > 0f) { currentSpeed = runSpeed; transform.root.SendMessage("ApplyTiredness", 30 * Time.deltaTime); } if (scriptCharacterStatus.stamina < 0f & scriptCharacterStatus.stamina > -10f) { currentSpeed = walkSpeed; transform.root.SendMessage("ApplyTiredness", 30 * Time.deltaTime); } } if (Input.GetKeyUp("left shift")) { currentSpeed = walkSpeed; } } moveDirection.y -= gravityPower * Time.deltaTime; // применяем гравитацию controllerC.Move(moveDirection * Time.deltaTime); // применяем движение } }
Скрипт, вращает и перемещает текстуру, может служить для создания мини-карты.
using UnityEngine; using System.Collections; public class RotateArrowScript : MonoBehaviour { public float angle; public Rect mainRect; public Texture guiTextur; Vector3 centerRotateOfGUI;//center point of Rotate void Start(){ centerRotateOfGUI = new Vector2(mainRect.x + mainRect.width / 2, mainRect.y + mainRect.height / 2); } void OnGUI(){ Matrix4x4 iniMatrix = GUI.matrix; GUIUtility.RotateAroundPivot(angle, centerRotateOfGUI);//Change GUI matrix GUI.DrawTexture(mainRect, guiTextur); ///There restore the initial GUI.matrix for future elements from iniMatrix; GUI.matrix = iniMatrix; } }
Скрипт автоматической двери:
var animOpen : AnimationClip; var animClose : AnimationClip; var soundOpen : AudioClip; var soundClose : AudioClip; private var open = 1; private var close = 0; function OnTriggerEnter (other : Collider) { if (open == 1) { open = 0; Open (); } } function OnTriggerExit (other : Collider) { if (close == 1) { close = 0; Close (); } } function Open () { audio.clip = soundOpen; audio.Play(); animation.clip = animOpen; animation.Play(); yield WaitForSeconds (animation.clip.length); close = 1; } function Close () { audio.clip = soundClose; audio.Play(); animation.clip = animClose; animation.Play(); yield WaitForSeconds (animation.clip.length); open = 1; }
--
Скрипт вещам на объект с компонентом анимации.
Коллайдер объекта ставим как на рисунке.
Коллайдеру галочку на isTrigger.
Скрипт анимированной деколи:
var frames : Texture[]; private var index = 0; function FixedUpdate () { renderer.material.mainTexture = frames[index]; if (index < frames.Length - 1) index += 1; else index = 0; }
В переменной Frames устанавливаем кол-во кадров и перетаскиваем в нее картинки в порядке последовательности.
Скрипт для перехода персонажа между уровнями с указанием точки появления и угла поворота в каждой сцене
function Awake () { DontDestroyOnLoad (transform.gameObject); } function OnLevelWasLoaded (level : int) { if (level == 0){ Destroy(gameObject); } if (level == 2) { transform.position = Vector3(2334.9,686.4,1833.3); transform.rotation = Quaternion.Euler(0, 66, 0); } if (level == 3) { transform.position = Vector3(29,3.4,42); transform.rotation = Quaternion.Euler(0, 137, 0); } if (level == 4) { transform.position = Vector3(26,2.3,48); transform.rotation = Quaternion.Euler(0, 490, 0); } if (level == 5) { transform.position = Vector3(21,7,45); transform.rotation = Quaternion.Euler(0, 0, 0); } }
Скрипт отключения/включения курсора по нажатию ESC
#pragma strict var esc: boolean; function Start () { Screen.showCursor = false; Screen.lockCursor = true; } function Update () { if(Input.GetKeyDown("escape") && !esc){ esc = true; Screen.showCursor = true; Screen.lockCursor = false; GameObject.Find("IGROK").GetComponent(MouseLook).enabled = false; GameObject.Find("Main Camera").GetComponent(MouseLook).enabled = false; } else if (Input.GetKeyDown("escape") && esc){ esc = false; Screen.showCursor = false; Screen.lockCursor = true; GameObject.Find("IGROK").GetComponent(MouseLook).enabled = true; GameObject.Find("Main Camera").GetComponent(MouseLook).enabled = true; } }
Что - то вроде TankTrackController из танк туториала, только более уравновешеный, и со звуком (На JS написал с нуля)
Инструкция по переменным в самом скрипте. Некоторые значения уже проставлены. Экспериментируйте.
var WheelsR : GameObject[]; // правые кости для гусиници var WheelsL : GameObject[]; // левые кости для гусиници var DummysR : WheelCollider[]; // пр. колеса var DummysL : WheelCollider[]; // лев. колеса var WheelRadius = 0.0; var WheelStPos = 0.0; // настройте сами(поездите, и поймете, что это) var WheelH = 0.0; // тоже настройте сами var Axeleration = 30.0; var MultAx = 40.0; var RotationAxel = 12.0; var BackwardBrT = 1.0; // троможение, при заднем ходе var COM : Vector3; // это прибавляется к Центру массы var Drag = 2.5; var BDrag = 10.0; private var DragP = 0.0; private var RAxel = 0.0; private var LAxel = 0.0; var BreakForce = 40.0; var TextureMuvingSpeed = 0.7; var TextureRigidbodyMyltiply = 0.2; var TexMuvingAxis : TMAxis; // Ось движения текстуры enum TMAxis { x = 0, y = 1 } var TrackR : GameObject; // пр. трак var TrackL : GameObject; // лев. трак private var RAxelp = 0.0; private var LAxelp = 0.0; var RSound : GameObject; // Звук пр. колес var LSound : GameObject; // Звук лев. колес var Sound1 = 0.8; var Sound2 = 60.0; function Start () { rigidbody.centerOfMass += COM; } function Update () { DummyPosition (); Axel (); } function DummyPosition (){ var GrHit : RaycastHit; var WhileNo = 0; if (DummysR[WhileNo].isGrounded){ Physics.Raycast(DummysR[WhileNo].transform.position, -DummysR[WhileNo].transform.up, GrHit); WheelsR[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsR[WhileNo].transform.position = DummysR[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (DummysL[WhileNo].isGrounded){ Physics.Raycast(DummysL[WhileNo].transform.position, -DummysL[WhileNo].transform.up, GrHit); WheelsL[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsL[WhileNo].transform.position = DummysL[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (WhileNo != WheelsL.Length){ WhileNo += 1; if (DummysR[WhileNo].isGrounded){ Physics.Raycast(DummysR[WhileNo].transform.position, -DummysR[WhileNo].transform.up, GrHit); WheelsR[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsR[WhileNo].transform.position = DummysR[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (DummysL[WhileNo].isGrounded){ Physics.Raycast(DummysL[WhileNo].transform.position, -DummysL[WhileNo].transform.up, GrHit); WheelsL[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsL[WhileNo].transform.position = DummysL[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); } if (WhileNo != WheelsL.Length){ WhileNo += 1; if (DummysR[WhileNo].isGrounded){ Physics.Raycast(DummysR[WhileNo].transform.position, -DummysR[WhileNo].transform.up, GrHit); WheelsR[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsR[WhileNo].transform.position = DummysR[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (DummysL[WhileNo].isGrounded){ Physics.Raycast(DummysL[WhileNo].transform.position, -DummysL[WhileNo].transform.up, GrHit); WheelsL[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsL[WhileNo].transform.position = DummysL[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); } if (WhileNo != WheelsL.Length){ WhileNo += 1; if (DummysR[WhileNo].isGrounded){ Physics.Raycast(DummysR[WhileNo].transform.position, -DummysR[WhileNo].transform.up, GrHit); WheelsR[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsR[WhileNo].transform.position = DummysR[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (DummysL[WhileNo].isGrounded){ Physics.Raycast(DummysL[WhileNo].transform.position, -DummysL[WhileNo].transform.up, GrHit); WheelsL[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsL[WhileNo].transform.position = DummysL[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); } if (WhileNo != WheelsL.Length){ WhileNo += 1; if (DummysR[WhileNo].isGrounded){ Physics.Raycast(DummysR[WhileNo].transform.position, -DummysR[WhileNo].transform.up, GrHit); WheelsR[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsR[WhileNo].transform.position = DummysR[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (DummysL[WhileNo].isGrounded){ Physics.Raycast(DummysL[WhileNo].transform.position, -DummysL[WhileNo].transform.up, GrHit); WheelsL[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsL[WhileNo].transform.position = DummysL[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); } if (WhileNo != WheelsL.Length){ WhileNo += 1; if (DummysR[WhileNo].isGrounded){ Physics.Raycast(DummysR[WhileNo].transform.position, -DummysR[WhileNo].transform.up, GrHit); WheelsR[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsR[WhileNo].transform.position = DummysR[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (DummysL[WhileNo].isGrounded){ Physics.Raycast(DummysL[WhileNo].transform.position, -DummysL[WhileNo].transform.up, GrHit); WheelsL[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsL[WhileNo].transform.position = DummysL[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); } if (WhileNo != WheelsL.Length){ WhileNo += 1; if (DummysR[WhileNo].isGrounded){ Physics.Raycast(DummysR[WhileNo].transform.position, -DummysR[WhileNo].transform.up, GrHit); WheelsR[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsR[WhileNo].transform.position = DummysR[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); if (DummysL[WhileNo].isGrounded){ Physics.Raycast(DummysL[WhileNo].transform.position, -DummysL[WhileNo].transform.up, GrHit); WheelsL[WhileNo].transform.position = GrHit.point + transform.TransformDirection(Vector3(WheelH,WheelRadius,0)); }else WheelsL[WhileNo].transform.position = DummysL[WhileNo].transform.position + transform.TransformDirection(Vector3(WheelH,WheelStPos,0)); } } function Axel (){ RAxel = Mathf.Lerp(RAxel, (Input.GetAxis("Vertical") * Axeleration) - ((Input.GetAxis("Horizontal") - (RAxelp / 2)) * RotationAxel), Time.deltaTime * MultAx); LAxel = Mathf.Lerp(LAxel, (Input.GetAxis("Vertical") * Axeleration) + ((Input.GetAxis("Horizontal") - (LAxelp / 2)) * RotationAxel), Time.deltaTime * MultAx); RAxelp = Mathf.Lerp(RAxelp, (Input.GetAxis("Horizontal")), Time.deltaTime); LAxelp = Mathf.Lerp(LAxelp, (Input.GetAxis("Horizontal")), Time.deltaTime); if (Input.GetAxis("Vertical") < 0){ DragP = BDrag; }else DragP = Drag; for (var Hit : WheelCollider in DummysR){ if (!Hit) continue; Hit.motorTorque = RAxel - (rigidbody.velocity.magnitude / DragP); Hit.sidewaysFriction.stiffness = 0.11 - Mathf.Abs( RAxelp / 10); if (!Input.GetButton("Horizontal") && !Input.GetButton("Vertical")) Hit.brakeTorque = BreakForce; else Hit.brakeTorque = 0; if (Input.GetAxis("Vertical") < 0) Hit.brakeTorque = rigidbody.velocity.magnitude * BackwardBrT; } if (TexMuvingAxis == 0){ TrackR.renderer.material.mainTextureOffset.x += Time.deltaTime * TextureMuvingSpeed * RAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply); TrackR.renderer.material.SetTextureOffset ("_NoiseTex", Vector2 (-Time.time * TextureMuvingSpeed * RAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply), 0.0)); TrackL.renderer.material.mainTextureOffset.x += Time.deltaTime * TextureMuvingSpeed * LAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply); TrackL.renderer.material.SetTextureOffset ("_NoiseTex", Vector2 (-Time.time * TextureMuvingSpeed * LAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply), 0.0)); }else{ TrackR.renderer.material.mainTextureOffset.y += Time.deltaTime * TextureMuvingSpeed * RAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply); TrackR.renderer.material.SetTextureOffset ("_NoiseTex", Vector2 (0.0, -Time.time * TextureMuvingSpeed * RAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply))); TrackL.renderer.material.mainTextureOffset.y += Time.deltaTime * TextureMuvingSpeed * LAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply); TrackL.renderer.material.SetTextureOffset ("_NoiseTex", Vector2 (0.0, -Time.time * TextureMuvingSpeed * LAxel + (rigidbody.velocity.magnitude * TextureRigidbodyMyltiply))); } for (var Hit2 : WheelCollider in DummysL){ if (!Hit2) continue; Hit2.motorTorque = LAxel - (rigidbody.velocity.magnitude / DragP); Hit2.sidewaysFriction.stiffness = 0.11 - Mathf.Abs( LAxelp / 10); if (!Input.GetButton("Horizontal") && !Input.GetButton("Vertical")) Hit2.brakeTorque = BreakForce; else Hit2.brakeTorque = 0; if (Input.GetAxis("Vertical") < 0) Hit2.brakeTorque = rigidbody.velocity.magnitude * BackwardBrT; } RSound.audio.pitch = Mathf.Lerp(RSound.audio.pitch,Sound1 + (RAxel / Sound2), Time.deltaTime * 2); LSound.audio.pitch = Mathf.Lerp(LSound.audio.pitch,Sound1 + (LAxel / Sound2), Time.deltaTime * 2); }
База для создания функции плавания в воде. Еще нужно много чего добавить.. Но может кому и пригодится
using UnityEngine; using System.Collections; public class Test1 : MonoBehaviour { public CharacterController player; public bool isTriger; // Use this for initialization void Start () { isTriger=false; } // Update is called once per frame void Update () { if(Input.GetKeyDown(KeyCode.LeftShift)) { player.GetComponent<CharacterMotor>().movement.maxForwardSpeed=90; } else { if(Input.GetKeyUp(KeyCode.LeftShift)) { player.GetComponent<CharacterMotor>().movement.maxForwardSpeed=6; } } if(isTriger) { player.GetComponent<CharacterMotor>().movement.gravity=5; if(Input.GetKey(KeyCode.Space)) { player.transform.position=new Vector3(player.transform.position.x,player.transform.position.y+0.5f,player.transform.position.z); player.GetComponent<CharacterMotor>().movement.maxFallSpeed=3; } } } void OnTriggerEnter(Collider other) { if(other.tag =="water" && isTriger==false) { isTriger=true; } } void OnTriggerExit(Collider other) { if(other.tag =="water" && isTriger==true) { isTriger=false; } } }
2 скрипта:
1) Движение камеры прямо пропорциональное движению мыши(Как в MMORPG):
using UnityEngine; using System.Collections; public class camMove : MonoBehaviour { public Transform target; //Объект за которым летаем(Наш персонаж) public float distance = 3.0f; //Расстояние от камеры до объекта public float xSpeed = 125.0f; //Чувствительность по оси X public float ySpeed = 50.0f; //Чувствительность по оси Y public float targetHeight = 2.0f; //Высота относительно объекта //Лимиты public float yMinLimit = -40; public float yMaxLimit = 80; //Приближение, удаление и скорость вращения камеры public float maxDistance = 10.0f; public float minDistance = 0.5f; public float zoomRotate = 90.0f; private float x = 0.0f; //Угол поворота по X private float y = 0.0f; //Угол поворота по Y [AddComponentMenu("Scripts/Mouse Orbit")] //Добавляем в меню public void Start() { //переворачиваем углы Vector3 angles = transform.eulerAngles; x = angles.y; y = angles.x; if (rigidbody) rigidbody.freezeRotation = true; //Если камера столкнется с физическим объектом, она остановиться } public void LateUpdate() { if (target) {//Если цель установлена(Персонаж) //Меняем углы согласно положению мыши x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; //Меняем дистанцию до персонажа. distance -= (Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime) * zoomRote * Mathf.Abs(distance); distance = Mathf.Clamp(distance, minDistance, maxDistance); y = ClampAngle(y, yMinLimit, yMaxLimit); //Вызов функции для ограничения углов поворота if(Input.GetMouseButton(1)) playerMove.x = x; //Если нажата ПКМ, Rotate у нашего персонажа. //Повернуть камеру согласно полученным данным Quaternion rotation = Quaternion.Euler(y, x, 0); transform.rotation = rotation; //Двигаем камеру и следим за персонажем Vector3 position = rotation * new Vector3(0.0f, targetHeight + 0.5f, -distance) + target.position; transform.position = position; //Во избежание провала под ландшафт RaycastHit hit; Vector3 trueTargetPosition = target.transform.position - new Vector3(0, -targetHeight, 0); if (Physics.Linecast(trueTargetPosition, transform.position, out hit)) { float tempDistance = Vector3.Distance(trueTargetPosition, hit.point) - 0.28f; position = target.position - (rotation * Vector3.forward * tempDistance + new Vector3(0, -targetHeight, 0)); transform.position = position; } } } //Меняем значения углов public static float ClampAngle(float angle, float min, float max) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp(angle, min, max); } }
2) Движение игрока (как в MMORPG):
using UnityEngine; using System.Collections; public class playerMove : MonoBehaviour { private GameObject player; public static int speed = 5; //Скорость перемещения персонажа public static int ALWspeed; //постоянная скорость перемещения персонажа public int rotation = 250; //Скорость поворота персонажа public int jump = 3; //Высота прыжка public static float x = 0.0f; //угол поворота персонажа по оси x void Start() { ALWspeed = speed; //Приравниваем скорости player = (GameObject)this.gameObject; //Объект накотором висит скрипт - игрок } void Update() { Quaternion rotate = Quaternion.Euler(0, x, 0); bool canRun = false; //Для движения speed = ALWspeed; //Shift: if (Input.GetKey(KeyCode.LeftShift)) { speed = ALWspeed * 2 + 2; } if (Input.GetKeyUp(KeyCode.LeftShift)) //Если отпустить { speed = ALWspeed; //Возвращаем стандартное значение } //A: if (Input.GetKey(KeyCode.A)) { rotate = Quaternion.Euler(0, x -90.0f, 0); if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.W)) rotate = Quaternion.Euler(0, x + 45.0f, 0); if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.S)) rotate = Quaternion.Euler(0, x - 45.0f, 0); canRun = true; if (Input.GetKey(KeyCode.LeftShift)) animation.CrossFade("Run"); else animation.CrossFade("Walk"); } if (Input.GetKeyUp(KeyCode.A)) { animation.CrossFade("idle"); canRun = false; } //D: if (Input.GetKey(KeyCode.D)) { rotate = Quaternion.Euler(0, x + 90.0f, 0); if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.W)) rotate = Quaternion.Euler(0, x - 45.0f, 0); if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.S)) rotate = Quaternion.Euler(0, x + 45.0f, 0); canRun = true; if (Input.GetKey(KeyCode.LeftShift)) animation.CrossFade("Run"); else animation.CrossFade("Walk"); } if (Input.GetKeyUp(KeyCode.D)) { animation.CrossFade("idle"); canRun = false; } //W: if (Input.GetKey(KeyCode.W)) { if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.A)) rotate = Quaternion.Euler(0, x - 45.0f, 0); if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D)) rotate = Quaternion.Euler(0, x + 45.0f, 0); canRun = true; if(Input.GetKey(KeyCode.LeftShift)) animation.CrossFade("Run"); else animation.CrossFade("Walk"); } if (Input.GetKeyUp(KeyCode.W)) { animation.CrossFade("idle"); canRun = false; } //S: if (Input.GetKey(KeyCode.S)) { rotate = Quaternion.Euler(0, x + 180.0f, 0); if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.A)) rotate = Quaternion.Euler(0, x - 135.0f, 0); if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.D)) rotate = Quaternion.Euler(0, x + 135.0f, 0); canRun = true; if (Input.GetKey(KeyCode.LeftShift)) animation.CrossFade("Run"); else animation.CrossFade("Walk"); } if (Input.GetKeyUp(KeyCode.S)) { animation.CrossFade("idle"); canRun = false; } //Space: if (Input.GetKey(KeyCode.Space)) { animation.CrossFade("Jump"); player.transform.position += player.transform.up * jump * Time.deltaTime; } if (Input.GetKeyUp(KeyCode.Space)) animation.CrossFade("idle"); //LMB: if (Input.GetMouseButtonDown(0)) animation.CrossFade("Attack"); //rotation: player.transform.rotation = rotate; //Движение if(canRun == true) player.transform.position += player.transform.forward * speed * Time.deltaTime; } }
Маленькое примечание: Скрипты слегка взаимодействуют друг с другом - При нажатии на ПКМ поворот персонажа по X будет равняться углу поворота по X. камере.
скрипт приседания на UJS:
var controller : CharacterController; var oldHeight; var newHeight: float; var newPos; function Start () { controller = GetComponent(CharacterController); oldHeight = controller.height; } function Update() { newPos = new Vector3(transform.position.x, transform.position.y + 0.7f, transform.position.z); if (Input.GetKey(KeyCode.LeftControl)) { controller.height = newHeight; } else { if (Input.GetKeyUp (KeyCode.LeftControl)) { controller.height = oldHeight; transform.position = newPos; } } }
Но можно ещё и так:
var controller : CharacterController; var oldHeight; function Start () { controller = GetComponent(CharacterController); oldHeight = controller.height; } function Update() { if (Input.GetKey(KeyCode.LeftControl)) controller.height = controller.height / 2; if (Input.GetKeyUp (KeyCode.LeftControl)) { controller.height = oldHeight; transform.position.y = transform.position.y + 0.7f; } }
И так:
var controller : CharacterController; var oldHeight; var flagStand = false; var dist; function Start () { controller = GetComponent(CharacterController); oldHeight = controller.height; dist = oldheight / 4 ; //вообще - (oldheight - controller.height) / 2, но т.к. controller.height == oldheight / 2, то получаем это } function Update() { if(flagStand && !Physics.Raycast (transform.position, Vector2.up, oldheight / 2)) { StandUo(); flagStand = false; } if (Input.GetKey(KeyCode.LeftControl)) Squatting(); if (Input.GetKeyUp (KeyCode.LeftControl) ) { if(!Physics.Raycast (transform.position, Vector2.up, oldheight / 2)) StandUp(); else flagStand = true; } } function StandUp() { controller.height = oldHeight; transform.position.y = transform.position.y + dist + 0.01f } functoin Squatting() { controller.height = controller.height / 2; transform.position.y = transform.position.y - dist + 0.01f; }
Вот ещё:
var anim_1: AnimationClip; var anim_2: AnimationClip; var SIDIT : boolean = false; var potolok = false; var looch = 12;//длина луча function Start () { animation[anim_1.name].speed = 3; animation[anim_1.name].wrapMode = WrapMode.Once; animation[anim_2.name].speed = 3; animation[anim_2.name].wrapMode = WrapMode.Once; } function Update() { if (Input.GetKeyDown(KeyCode.LeftControl) && !SIDIT) { animation.Play(anim_1.name); SIDIT = true; } if (Input.GetKeyUp(KeyCode.LeftControl) && SIDIT && !Physics.Raycast (transform.position, transform.TransformDirection (Vector3.up), looch)) { animation.Play(anim_2.name); SIDIT = false; } else { if (Input.GetKeyUp(KeyCode.LeftControl) && SIDIT && Physics.Raycast (transform.position, transform.TransformDirection (Vector3.up), looch)) { potolok = true; return; } } if(potolok && !Physics.Raycast (transform.position, transform.TransformDirection (Vector3.up), looch)){ animation.Play(anim_2.name); SIDIT = false; potolok = false; } }