Вот скрипт примитивного движения:
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;
}
}