Готовые скрипты и функции
gforcer Дата: Пт, 09 Окт 2009, 14:39 | Сообщение # 1
Сообщений: 134
Награды:
0
Репутация:
80
Статус: Offline
Вот скрипт примитивного движения: Code
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)
FPSWalker.js из стандартного пакета.
Сообщение отредактировал Dekterev - Сб, 03 Дек 2011, 23:28
Сообщение Вот скрипт примитивного движения: Code
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)
FPSWalker.js из стандартного пакета. Автор - gforcer Дата добавления - 09 Окт 2009 в 14:39
Zaicheg Дата: Пт, 09 Окт 2009, 19:21 | Сообщение # 2
Сообщений: 20
Награды:
0
Репутация:
12
Статус: Offline
Поясню, что код в первом посте — FPSWalker.js из стандартного пакета. Я тут, кстати, для мелких нужд его на C# переписывал. Выкладываю код — может так кому проще будет въехать в разницу между JS и C#. Там ещё по мелочи добавлено, но всё с комментами — не потеряетесь. На scriptCharacterStatus и stamina не обращайте внимания — это я в соседний скрипт информацию передаю. Code
// передвижение персонажа 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); // применяем движение } }
Сообщение Поясню, что код в первом посте — FPSWalker.js из стандартного пакета. Я тут, кстати, для мелких нужд его на C# переписывал. Выкладываю код — может так кому проще будет въехать в разницу между JS и C#. Там ещё по мелочи добавлено, но всё с комментами — не потеряетесь. На scriptCharacterStatus и stamina не обращайте внимания — это я в соседний скрипт информацию передаю. Code
// передвижение персонажа 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); // применяем движение } }
Автор - Zaicheg Дата добавления - 09 Окт 2009 в 19:21
proektEK Дата: Пн, 30 Авг 2010, 22:14 | Сообщение # 3
Сообщений: 493
Награды:
6
Репутация:
193
Статус: Offline
Нашел скрипт, вращает и перемещает текстуру, может служить для создания миникарты. Code
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; } }
Сообщение отредактировал proektEK - Пт, 20 Авг 2010, 20:49
Сообщение Нашел скрипт, вращает и перемещает текстуру, может служить для создания миникарты. Code
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; } }
Автор - proektEK Дата добавления - 30 Авг 2010 в 22:14
Левша Дата: Чт, 19 Янв 2012, 03:58 | Сообщение # 4
Черный Волк
Сообщений: 7257
Награды:
30
Репутация:
3313
Статус: Offline
Скрипт автоматической двери: Code
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 . Скрипт анимированной деколи: Code
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 устанавливаем кол-во кадров и перетаскиваем в нее картинки в порядке последовательности.
X.cor.R (Prologue)
Сообщение Скрипт автоматической двери: Code
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 . Скрипт анимированной деколи: Code
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 устанавливаем кол-во кадров и перетаскиваем в нее картинки в порядке последовательности. Автор - Левша Дата добавления - 19 Янв 2012 в 03:58
dostalition Дата: Чт, 18 Апр 2013, 19:05 | Сообщение # 5
Сообщений: 155
Награды:
0
Репутация:
9
Статус: Offline
Скрипт для перехода персонажа между уровнями с указанием точки появления и угла поворота в каждой сцене ... Код
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); } }
Добавлено (18.04.2013, 19:05) --------------------------------------------- Скрипт отключения/включения курсора по нажатию 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; } }
Сообщение Скрипт для перехода персонажа между уровнями с указанием точки появления и угла поворота в каждой сцене ... Код
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); } }
Добавлено (18.04.2013, 19:05) --------------------------------------------- Скрипт отключения/включения курсора по нажатию 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; } }
Автор - dostalition Дата добавления - 18 Апр 2013 в 19:05
VolkOrievith Дата: Чт, 25 Июл 2013, 11:15 | Сообщение # 6
Сообщений: 222
Награды:
0
Репутация:
53
Статус: Offline
Что - то вроде 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); }
Я так думаю, что эта тема не для вопросов, так что вопросы в личку.
Сообщение Что - то вроде 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); }
Я так думаю, что эта тема не для вопросов, так что вопросы в личку. Автор - VolkOrievith Дата добавления - 25 Июл 2013 в 11:15
Igor_Tyner Дата: Чт, 28 Ноя 2013, 18:07 | Сообщение # 7
Сообщений: 1
Награды:
0
Репутация:
0
Статус: Offline
База для создания функции плавания в воде. Еще нужно много чего добавить.. Но может кому и пригодится Код
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; } } }
Сообщение База для создания функции плавания в воде. Еще нужно много чего добавить.. Но может кому и пригодится Код
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; } } }
Автор - Igor_Tyner Дата добавления - 28 Ноя 2013 в 18:07
N0rator Дата: Сб, 28 Дек 2013, 14:24 | Сообщение # 8
Сообщений: 16
Награды:
0
Репутация:
1
Статус: Offline
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. камере.
Сообщение отредактировал N0rator - Сб, 28 Дек 2013, 18:31
Сообщение 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. камере. Автор - N0rator Дата добавления - 28 Дек 2013 в 14:24
VolkOrievith Дата: Вс, 06 Июл 2014, 12:49 | Сообщение # 9
Сообщений: 222
Награды:
0
Репутация:
53
Статус: Offline
Переделывал скрипт SmoothFollow и вот что получил: Код
var target : Transform; var LookAt : Transform; var distance = 10.0; var height = 5.0; var positionDamping = 5.0; private var TargetedPosition : Vector3; function FixedUpdate () { if (!target) return; TargetedPosition = target.position+target.TransformDirection(Vector3(0,height,-distance)); transform.position = Vector3.Lerp(transform.position, TargetedPosition, Time.fixedDeltaTime*positionDamping); transform.LookAt (LookAt); }
Работает хорошо. Я его использовал для камеры 3его лица над вертолетом. Камера смотрит на "var LookAt : Transform;" и следует за "var target : Transform;".
Сообщение Переделывал скрипт SmoothFollow и вот что получил: Код
var target : Transform; var LookAt : Transform; var distance = 10.0; var height = 5.0; var positionDamping = 5.0; private var TargetedPosition : Vector3; function FixedUpdate () { if (!target) return; TargetedPosition = target.position+target.TransformDirection(Vector3(0,height,-distance)); transform.position = Vector3.Lerp(transform.position, TargetedPosition, Time.fixedDeltaTime*positionDamping); transform.LookAt (LookAt); }
Работает хорошо. Я его использовал для камеры 3его лица над вертолетом. Камера смотрит на "var LookAt : Transform;" и следует за "var target : Transform;". Автор - VolkOrievith Дата добавления - 06 Июл 2014 в 12:49
Thedrhax14 Дата: Чт, 10 Июл 2014, 20:54 | Сообщение # 10
Сообщений: 54
Награды:
0
Репутация:
1
Статус: Offline
Простой скрипт жизни перса, вешать прям на вашего персонажа, так же есть возможность редактировать расположения показателя жизней. Скрипт отвечает так и за снятие жизней ( function ApplyDamage) и наоборот ( function ApplyHealth). Код
//Character's health private var player_health_max : int = 100; private var player_health_min : int = 0; static var player_health : int = 100; var PositionOfBoxX:int; var PositionOfBoxY:int; var player_death : boolean = false; var Player: GameObject; var deadPlayer:GameObject; function Update () { if (player_health >= player_health_max) { player_health = player_health_max; } if (player_health <= player_health_min) { player_death = true; player_health = player_health_min; } } function ApplyDamage(Damage : float) { player_health-=Damage; } function ApplyHealth(HealthAmount:int) { player_health += HealthAmount; } function OnGUI () { if (player_death) { Instantiate(deadPlayer,transform.position,transform.rotation); Destroy(Player); } GUI.Box (Rect (PositionOfBoxX, PositionOfBoxY, 300, 40), "Здоровье: "+ player_health); }
Виду блог про разроботку игр и про свои проекты https://thedrhax14.wordpress.com/
Сообщение отредактировал Thedrhax14 - Чт, 10 Июл 2014, 20:55
Сообщение Простой скрипт жизни перса, вешать прям на вашего персонажа, так же есть возможность редактировать расположения показателя жизней. Скрипт отвечает так и за снятие жизней ( function ApplyDamage) и наоборот ( function ApplyHealth). Код
//Character's health private var player_health_max : int = 100; private var player_health_min : int = 0; static var player_health : int = 100; var PositionOfBoxX:int; var PositionOfBoxY:int; var player_death : boolean = false; var Player: GameObject; var deadPlayer:GameObject; function Update () { if (player_health >= player_health_max) { player_health = player_health_max; } if (player_health <= player_health_min) { player_death = true; player_health = player_health_min; } } function ApplyDamage(Damage : float) { player_health-=Damage; } function ApplyHealth(HealthAmount:int) { player_health += HealthAmount; } function OnGUI () { if (player_death) { Instantiate(deadPlayer,transform.position,transform.rotation); Destroy(Player); } GUI.Box (Rect (PositionOfBoxX, PositionOfBoxY, 300, 40), "Здоровье: "+ player_health); }
Автор - Thedrhax14 Дата добавления - 10 Июл 2014 в 20:54
Gena Дата: Сб, 15 Ноя 2014, 21:53 | Сообщение # 11
Сообщений: 4
Награды:
0
Репутация:
0
Статус: Offline
Zaicheg , Ошибка:
Сообщение Zaicheg , Ошибка: Автор - Gena Дата добавления - 15 Ноя 2014 в 21:53
Сахар Дата: Чт, 12 Мар 2015, 10:26 | Сообщение # 12
Сообщений: 3
Награды:
0
Репутация:
0
Статус: Offline
Скрипт фонарика. Код
using UnityEngine; using System.Collections; public class Lantern : MonoBehaviour { public Light lantern; private bool lantern_off = true; void Start() { lantern.range = 0; } void Update () { if(Input.GetKeyUp(KeyCode.L)) { lantern_off = !lantern_off; } if (Input.GetKeyUp(KeyCode.L) && lantern_off == true) { lantern.range = 0; } else if (Input.GetKeyUp(KeyCode.L) && lantern_off == false) { lantern.range = 10; } if (lantern == null) { Debug.LogError("АХТУНГ!!! Отсутствует источник света"); } } }
Сообщение Скрипт фонарика. Код
using UnityEngine; using System.Collections; public class Lantern : MonoBehaviour { public Light lantern; private bool lantern_off = true; void Start() { lantern.range = 0; } void Update () { if(Input.GetKeyUp(KeyCode.L)) { lantern_off = !lantern_off; } if (Input.GetKeyUp(KeyCode.L) && lantern_off == true) { lantern.range = 0; } else if (Input.GetKeyUp(KeyCode.L) && lantern_off == false) { lantern.range = 10; } if (lantern == null) { Debug.LogError("АХТУНГ!!! Отсутствует источник света"); } } }
Автор - Сахар Дата добавления - 12 Мар 2015 в 10:26
chapaeff Дата: Чт, 18 Фев 2016, 23:47 | Сообщение # 13
Сообщений: 48
Награды:
0
Репутация:
12
Статус: Offline
Цитата Сахар (
)
Скрипт фонарика.
1. Выключать фонарик через изменение Range - ужс. 2. если фонарик - нулл, то можно было уже добавлять новый
--------------------------------------------------------------------------------------- Throw Exception (ノಠ益ಠ)ノ彡┻━┻ Catch Exception ┬──┬ ノ( ゜-゜ノ)
Сообщение Цитата Сахар (
)
Скрипт фонарика.
1. Выключать фонарик через изменение Range - ужс. 2. если фонарик - нулл, то можно было уже добавлять новыйАвтор - chapaeff Дата добавления - 18 Фев 2016 в 23:47
RealGamesWorld Дата: Пт, 16 Мар 2018, 17:16 | Сообщение # 14
Карто-строитель
Сообщений: 190
Награды:
2
Репутация:
70
Статус: Offline
Делал для своего проекта.. Простой скриптик. C# Что то типо LOD.. При определенном расстоянии обьекты выключаются со сцены и убирают нагрузку.Код
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LOD : MonoBehaviour { public float distLOD; public GameObject CameraLOD; public GameObject ObjectLOD; public float RadiusLOD = 50; // Use this for initialization void Start () { } // Update is called once per frame void Update () { distLOD = Vector3.Distance (CameraLOD.transform.position, transform.position); if (distLOD >= RadiusLOD) { ObjectLOD.SetActive(false); } if (distLOD <= RadiusLOD) { ObjectLOD.SetActive(true); } } }
Сообщение Делал для своего проекта.. Простой скриптик. C# Что то типо LOD.. При определенном расстоянии обьекты выключаются со сцены и убирают нагрузку.Код
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LOD : MonoBehaviour { public float distLOD; public GameObject CameraLOD; public GameObject ObjectLOD; public float RadiusLOD = 50; // Use this for initialization void Start () { } // Update is called once per frame void Update () { distLOD = Vector3.Distance (CameraLOD.transform.position, transform.position); if (distLOD >= RadiusLOD) { ObjectLOD.SetActive(false); } if (distLOD <= RadiusLOD) { ObjectLOD.SetActive(true); } } }
Автор - RealGamesWorld Дата добавления - 16 Мар 2018 в 17:16