[TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
4 participantes
Página 1 de 1
[TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
Olá galera, refiz o tutorial sobre mover e arrastar objetos com o mouse, corrigindo novamente alguns bugs, dentre outras coisas... Para você poder mover objetos com o mouse (para personagens em primeira pessoa), basta criar um novo código em C#, com o nome "MoverObjetos", e utilizar este código nele:
Na variável 'texturaMaoAberta', basta jogar esta textura:
e na variável 'texturaMaoFechada', basta jogar esta outra textura:
Este script deve ser associado na Câmera do seu jogador, e a câmera DEVE ter a tag "MainCamera".
Agora, vamos configurar os objetos que podem ser arrastados... a tag padrão que vem no script é a palavra "Respawn", então, o que você deve fazer é colocar essa tag 'Respawn' nos objetos que você deseja poder mover... (esta tag pode ser modificada a gosto). Ah, outra coisa, os objetos que podem ser movidos, PRECISAM ter um colisor e um rigidbody, do contrário não vai funcionar.
Pronto, se o código está na sua câmera, as texturas estão associadas, os objetos já possuem a tag, Rigidbody e colisor, tudo deve funcionar...
O que ocorre agora é que você pode encontrar um incomodo ao girar a os objetos, pois se você estiver utilizando o FPSController padrão que vem com a Unity, ele acaba girando quando você move o mouse, e é para isto que o código possui a variável estática 'rotatingObject', que pode ser acessada por outros scripts, então basta você editar o script do FPSController para bloquear o movimento da câmera caso esta variável esteja verdadeira.
Uma possível solução alternativa para este problema da câmera se movendo enquanto o jogador rotaciona o objeto é utilizar um FPSController customizado, feito por mim, para isto, basta fazer o seguinte:
1 - Crie um objeto vazio
2 - Crie uma nova câmera e coloque a tag 'MainCamera' nela
3 - Torne esta nova câmera filha do objeto vazio que você criou
4 - Crie um novo script em C# chamado 'PlayerController' e use o código abaixo nele:
6 - Salve o script e associe ele ao objeto vazio que você havia criado, isto fará ele adicionar automaticamente um CharacterController ao objeto.
7 - Posicione a câmera que está dentro do objeto vazio, no topo do CharacterController, afinal, é em cima do corpo que fica a cabeça.
Pronto, agora você já tem o seu próprio FPSController para utilizar com o sistema de mover objetos... dai basta arrastar o script de mover objetos para a câmera deste FPSController e configurar tudo :D
- Código:
using System.Collections;
using UnityEngine;
public class MoverObjetos : MonoBehaviour {
public string tagObjects = "Respawn";
public KeyCode teclaRotacionar = KeyCode.R;
public bool ocultarOMouse = false;
public bool setarLayerNoPlayer = true;
public CursorLockMode _cursorLockMode = CursorLockMode.None;
[Space(15)][Range(1.0f,5.0f)]
public float distanciaMinima = 2.5f;
[Range(5.0f,9.0f)]
public float distanciaMaxima = 6;
[Range(1.0f,10.0f)]
public float velocidadeDeMovimento = 5;
[Range(10.0f,100.0f)]
public float velocidadeDeRotacao = 50;
[Range(5.0f,15.0f)]
public float velocidadeRoletaMouse = 10;
[Space(10)]
public float forcaParaArremessar = 200;
public float forcaParaMover = 200;
[Space(15)]
public Texture texturaMaoFechada;
public Texture texturaMaoAberta;
bool canMove;
bool blockMovement;
bool isMoving;
float distance;
float rotXTemp;
float rotYTemp;
float tempDistance;
RaycastHit tempHit;
Rigidbody rbTemp;
Vector3 rayEndPoint;
Vector3 tempDirection;
Vector3 tempSpeed;
Vector3 direcAddForceMode;
GameObject tempObject;
public static bool rotatingObject;
Camera mainCamera;
void Awake (){
distance = (distanciaMinima + distanciaMaxima)/2;
mainCamera = Camera.main;
if (!mainCamera) {
Debug.LogError ("O código não achou nenhuma camera com a tag 'MaiCamera'");
}
if (ocultarOMouse) {
Cursor.visible = false;
}
Cursor.lockState = _cursorLockMode;
if (setarLayerNoPlayer) {
GameObject refTemp = transform.root.gameObject;
refTemp.layer = 2;
foreach (Transform trans in refTemp.GetComponentsInChildren<Transform>(true)) {
trans.gameObject.layer = 2;
}
}
}
void Update (){
//raycast vector3.down
if (tempObject) {
if (Physics.Raycast (transform.position, Vector3.down, out tempHit, 5)) {
if (tempHit.transform.tag == tagObjects && tempObject.transform.gameObject == tempHit.transform.gameObject) {
blockMovement = true;
} else {
blockMovement = false;
}
} else {
blockMovement = false;
}
} else {
blockMovement = false;
}
//raycast camera forward
rayEndPoint = transform.position + transform.forward*distance;
if (Physics.Raycast (transform.position, transform.forward, out tempHit, (distanciaMaxima + 1))) {
if (Vector3.Distance (transform.position, tempHit.point) <= distanciaMaxima && tempHit.transform.tag == tagObjects) {
canMove = true;
} else {
canMove = false;
}
//
if (Input.GetKeyDown(KeyCode.Mouse0) && canMove) {
if (tempHit.rigidbody) {
tempHit.rigidbody.useGravity = true;
distance = Vector3.Distance (transform.position, tempHit.point);
tempObject = tempHit.transform.gameObject;
isMoving = true;
} else {
Debug.LogWarning ("O objeto que você está tentando arrastar não possui o componente Rigidbody");
}
}
} else {
canMove = false;
}
distance += Input.GetAxis ("Mouse ScrollWheel")*velocidadeRoletaMouse;
distance = Mathf.Clamp (distance, distanciaMinima, distanciaMaxima);
if (tempObject) {
rbTemp = tempObject.GetComponent<Rigidbody> ();
}
if (blockMovement && tempObject) {
rbTemp.useGravity = true;
tempObject = null;
rbTemp = null;
isMoving = false;
}
if (Input.GetKeyUp(KeyCode.Mouse0) && tempObject) {
rbTemp.useGravity = true;
tempObject = null;
rbTemp = null;
isMoving = false;
}
if (Input.GetKeyDown(KeyCode.Mouse1) && tempObject) {
tempDirection = rayEndPoint - transform.position;
tempDirection.Normalize ();
rbTemp.useGravity = true;
rbTemp.AddForce (tempDirection * forcaParaArremessar * 4);
tempObject = null;
rbTemp = null;
isMoving = false;
}
if (tempObject) {
if (Vector3.Distance (transform.position, tempObject.transform.position) > distanciaMaxima) {
rbTemp.useGravity = true;
tempObject = null;
rbTemp = null;
isMoving = false;
}
}
if (tempObject && mainCamera) {
if (Input.GetKey (teclaRotacionar)) {
rotatingObject = true;
rotXTemp = Input.GetAxis ("Mouse X") * velocidadeDeRotacao / 10;
rotYTemp = Input.GetAxis ("Mouse Y") * velocidadeDeRotacao / 10;
tempObject.transform.Rotate (mainCamera.transform.up, -rotXTemp, Space.World);
tempObject.transform.Rotate (mainCamera.transform.right, rotYTemp, Space.World);
}
if (Input.GetKeyUp (teclaRotacionar)) {
rotatingObject = false;
}
} else {
rotatingObject = false;
}
}
void FixedUpdate (){
if (tempObject) {
rbTemp = tempObject.GetComponent<Rigidbody> ();
rbTemp.angularVelocity = new Vector3 (0, 0, 0);
tempSpeed = (rayEndPoint - rbTemp.transform.position);
tempSpeed.Normalize ();
tempDistance = Vector3.Distance (rayEndPoint, rbTemp.transform.position);
tempDistance = Mathf.Clamp (tempDistance, 0, 1);
direcAddForceMode = tempSpeed * velocidadeDeMovimento * forcaParaMover * tempDistance;
rbTemp.velocity = Vector3.zero;
rbTemp.AddForce (direcAddForceMode, ForceMode.Force);
}
}
void OnGUI (){
if (canMove && !isMoving && texturaMaoAberta) {
GUI.DrawTexture(new Rect(Screen.width/2-texturaMaoAberta.width/2, Screen.height/2-texturaMaoAberta.height/2, texturaMaoAberta.width, texturaMaoAberta.height), texturaMaoAberta);
}
if (isMoving && texturaMaoFechada) {
GUI.DrawTexture(new Rect(Screen.width/2-texturaMaoFechada.width/2, Screen.height/2-texturaMaoFechada.height/2, texturaMaoFechada.width, texturaMaoFechada.height), texturaMaoFechada);
}
}
}
Na variável 'texturaMaoAberta', basta jogar esta textura:
e na variável 'texturaMaoFechada', basta jogar esta outra textura:
Este script deve ser associado na Câmera do seu jogador, e a câmera DEVE ter a tag "MainCamera".
Agora, vamos configurar os objetos que podem ser arrastados... a tag padrão que vem no script é a palavra "Respawn", então, o que você deve fazer é colocar essa tag 'Respawn' nos objetos que você deseja poder mover... (esta tag pode ser modificada a gosto). Ah, outra coisa, os objetos que podem ser movidos, PRECISAM ter um colisor e um rigidbody, do contrário não vai funcionar.
Pronto, se o código está na sua câmera, as texturas estão associadas, os objetos já possuem a tag, Rigidbody e colisor, tudo deve funcionar...
O que ocorre agora é que você pode encontrar um incomodo ao girar a os objetos, pois se você estiver utilizando o FPSController padrão que vem com a Unity, ele acaba girando quando você move o mouse, e é para isto que o código possui a variável estática 'rotatingObject', que pode ser acessada por outros scripts, então basta você editar o script do FPSController para bloquear o movimento da câmera caso esta variável esteja verdadeira.
Uma possível solução alternativa para este problema da câmera se movendo enquanto o jogador rotaciona o objeto é utilizar um FPSController customizado, feito por mim, para isto, basta fazer o seguinte:
1 - Crie um objeto vazio
2 - Crie uma nova câmera e coloque a tag 'MainCamera' nela
3 - Torne esta nova câmera filha do objeto vazio que você criou
4 - Crie um novo script em C# chamado 'PlayerController' e use o código abaixo nele:
- Código:
using System.Collections;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour {
GameObject cameraFPS;
Quaternion originalRotation;
Vector3 moveDirection = Vector3.zero;
CharacterController controller;
float rotacaoX = 0.0f, rotacaoY = 0.0f;
public float moveSpeed = 6.0f;
public float jumpSpeed = 7.5f;
void Start () {
transform.tag = "Player";
cameraFPS = GetComponentInChildren (typeof(Camera)).transform.gameObject;
originalRotation = cameraFPS.transform.localRotation;
controller = GetComponent<CharacterController>();
}
void Update () {
Vector3 forwardDirection = new Vector3 (cameraFPS.transform.forward.x,0,cameraFPS.transform.forward.z);
Vector3 sideDirection = new Vector3 (cameraFPS.transform.right.x,0,cameraFPS.transform.right.z);
forwardDirection.Normalize ();
sideDirection.Normalize ();
forwardDirection = forwardDirection * Input.GetAxis ("Vertical");
sideDirection = sideDirection * Input.GetAxis ("Horizontal");
Vector3 finalDirection = forwardDirection + sideDirection;
if (finalDirection.sqrMagnitude > 1) {
finalDirection.Normalize ();
}
if (controller.isGrounded) {
moveDirection = new Vector3 (finalDirection.x, 0, finalDirection.z);
moveDirection *= moveSpeed;
if (Input.GetButton ("Jump")/* && !Input.GetMouseButton(0)*/) {
moveDirection.y = jumpSpeed;
}
}
moveDirection.y -= 20.0f * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
FirstPerson ();
}
void FirstPerson(){
if (!MoverObjetos.rotatingObject) {
rotacaoX += Input.GetAxis ("Mouse X") * 7.0f;
rotacaoY += Input.GetAxis ("Mouse Y") * 7.0f;
}
rotacaoX = ClampAngleFPS (rotacaoX, -360, 360);
rotacaoY = ClampAngleFPS (rotacaoY, -80, 80);
Quaternion xQuaternion = Quaternion.AngleAxis (rotacaoX, Vector3.up);
Quaternion yQuaternion = Quaternion.AngleAxis (rotacaoY, -Vector3.right);
Quaternion finalRotation = originalRotation * xQuaternion * yQuaternion;
cameraFPS.transform.localRotation = Quaternion.Lerp (cameraFPS.transform.localRotation, finalRotation, Time.deltaTime*10.0f);
}
float ClampAngleFPS (float angle, float min, float max){
if (angle < -360F) { angle += 360F; }
if (angle > 360F) { angle -= 360F; }
return Mathf.Clamp (angle, min, max);
}
}
6 - Salve o script e associe ele ao objeto vazio que você havia criado, isto fará ele adicionar automaticamente um CharacterController ao objeto.
7 - Posicione a câmera que está dentro do objeto vazio, no topo do CharacterController, afinal, é em cima do corpo que fica a cabeça.
Pronto, agora você já tem o seu próprio FPSController para utilizar com o sistema de mover objetos... dai basta arrastar o script de mover objetos para a câmera deste FPSController e configurar tudo :D
Re: [TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
Marcos estou tendo um problema, mesmo com o seu fps a camera mexe com o mouse, tem que fazer mais alguma coisa?
E o mouse nao esta exatamente na mesma posicao das maos
E o mouse nao esta exatamente na mesma posicao das maos
vcalil123- Iniciante
- PONTOS : 2645
REPUTAÇÃO : 0
Respeito as regras :
Re: [TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
vcalil123 escreveu:Marcos estou tendo um problema, mesmo com o seu fps a camera mexe com o mouse, tem que fazer mais alguma coisa?
E o mouse nao esta exatamente na mesma posicao das maos
Tenta seguir novamente o tutorial passo a passo, sem pular nenhuma etapa...
Eu fiz aqui e funcionou 100%
Re: [TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
Ola mano pode me ajudar sempre que uso esse script a tag do meu personagem que está com a script associada na camera faz com que todo o complemento fiquem com a layer IgnoreRaycast e não com a layer default, ele meio que ignora todas as layer e fica somente com ignore raycast...
Exemplo
fpscontroller
meupersonagem
MainCamera
A main camera no caso com a script faz com que todos associados fiquem com a layer ignoreraycast
Exemplo
fpscontroller
meupersonagem
MainCamera
A main camera no caso com a script faz com que todos associados fiquem com a layer ignoreraycast
luckas211- Membro
- PONTOS : 2050
REPUTAÇÃO : 7
Respeito as regras :
Re: [TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
luckas211 escreveu:Ola mano pode me ajudar sempre que uso esse script a tag do meu personagem que está com a script associada na camera faz com que todo o complemento fiquem com a layer IgnoreRaycast e não com a layer default, ele meio que ignora todas as layer e fica somente com ignore raycast...
Exemplo
fpscontroller
meupersonagem
MainCamera
A main camera no caso com a script faz com que todos associados fiquem com a layer ignoreraycast
Alguém tem alguma ideia de como mudar a camada da layer pra funcionar com a layer default? pois só funciona com a ignoreRaycast
luckas211- Membro
- PONTOS : 2050
REPUTAÇÃO : 7
Respeito as regras :
Re: [TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
luckas211 escreveu:luckas211 escreveu:Ola mano pode me ajudar sempre que uso esse script a tag do meu personagem que está com a script associada na camera faz com que todo o complemento fiquem com a layer IgnoreRaycast e não com a layer default, ele meio que ignora todas as layer e fica somente com ignore raycast...
Exemplo
fpscontroller
meupersonagem
MainCamera
A main camera no caso com a script faz com que todos associados fiquem com a layer ignoreraycast
Alguém tem alguma ideia de como mudar a camada da layer pra funcionar com a layer default? pois só funciona com a ignoreRaycast
Ou você trabalha com LayerMask, selecionando quais Laysers o raycast vai ignorar, ouuuu você trabalha com RaycastAll, que pega uma array de todas as colisões do raycast, ai você decide quais quer utilizar
Re: [TUTORIAL] Mover, girar e lançar objetos com o MOUSE (Unity 2017, atualizado)
Muito obrigado por esse tutorial me ajudou bastante
alexandrecbb- Iniciante
- PONTOS : 1284
REPUTAÇÃO : 0
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Mover, Girar e lançar objetos com o mouse ( estilo Amnesia )
» [TUTORIAL] Mover, arremessar e girar objetos com o mouse
» [TUTORIAL] Mover Objeto para lugar do click do Mouse
» [TUTORIAL] Girar objetos / mover de acordo com a rotação do Celular,tablet,etc
» [TUTORIAL] Mover objetos com o mouse, estilo Amnesia
» [TUTORIAL] Mover, arremessar e girar objetos com o mouse
» [TUTORIAL] Mover Objeto para lugar do click do Mouse
» [TUTORIAL] Girar objetos / mover de acordo com a rotação do Celular,tablet,etc
» [TUTORIAL] Mover objetos com o mouse, estilo Amnesia
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos