Below is my mouse look script which controls touch and movement, now I am implementing multiple touch, For, which i used finger-ID, but after implementing this, my touch is'nt working, don't know why. By defult slider_finger_id is =-1;
if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
{
if( Input.touchCount>0 )
{
foreach (Touch touch in Input.touches)
{
if (touch_moving_tex.HitTest (touch.position))
{
if(touch.phase == TouchPhase.Began && touch.phase == TouchPhase.Moved && slider_finger_id ==-1)
{
if (axes == RotationAxes.MouseXAndY)
{
sensitivityX = main_fov;
noisedeltaX += ((((Mathf.Cos (Time.time) * Random.Range (-10, 10) / 5f) * noiseX) - noisedeltaX) / 100) * Time.timeScale;
rotationXtemp += (touch.deltaPosition.x * sensitivityX * sensitivity) + (noisedeltaX);
//rotationXtemp += (Input.GetTouch (0).deltaPosition.x * sensitivityX * sensitivity) + (noisedeltaX);
rotationX += ((rotationXtemp - rotationX) / 3) * Time.timeScale;
rotationX = Mathf.Clamp (rotationX, minimumX, maximumX);
sensitivityY = main_fov;
noisedeltaY += ((((Mathf.Sin (Time.time) * Random.Range (-10, 10) / 5f) * noiseY) - noisedeltaY) / 100) * Time.timeScale;
rotationYtemp += (touch.deltaPosition.y * sensitivityY * sensitivity) + (noisedeltaY);
rotationY += ((rotationYtemp - rotationY) / 3) * Time.timeScale;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (new Vector3 (-rotationY, rotationX, 0)), 9f * Time.deltaTime);
}
}
slider_finger_id = touch.fingerId;
}
if (touch.phase == TouchPhase.Ended)
{
if (touch.fingerId == slider_finger_id)
{
slider_finger_id = -1;
}
}
}
}
Actually, I was not getting touch.fingerId, and storing, and not checking for specific touch.fingerId, so I figured out by doing this. below is script and performing well. (main thing which I am doing in below code is, touch will work only for for first touch, doing by fingerId by saving touch.fingerId)
first I just checked touch count is greter than zero or not, then getting touches array and performing foreach loop, then checking rather touch is in my desire poistion or not, then getting first touch fingerId, and saves it in slider_finger_id, then using it.
if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
{
if( Input.touchCount>0 )
{
foreach (Touch touch in Input.touches)
{
if (touch_moving_tex.HitTest (touch.position))
{
if(touch.phase == TouchPhase.Began && slider_finger_id == -1)
{
slider_finger_id = touch.fingerId;
}
if(touch.phase == TouchPhase.Moved)
{
if (axes == RotationAxes.MouseXAndY)
{
sensitivityX = main_fov;
noisedeltaX += ((((Mathf.Cos (Time.time) * Random.Range (-10, 10) / 5f) * noiseX) - noisedeltaX) / 100) * Time.timeScale;
rotationXtemp += (touch.deltaPosition.x * sensitivityX * sensitivity) + (noisedeltaX);
//rotationXtemp += (Input.GetTouch (0).deltaPosition.x * sensitivityX * sensitivity) + (noisedeltaX);
rotationX += ((rotationXtemp - rotationX) / 3) * Time.timeScale;
rotationX = Mathf.Clamp (rotationX, minimumX, maximumX);
sensitivityY = main_fov;
noisedeltaY += ((((Mathf.Sin (Time.time) * Random.Range (-10, 10) / 5f) * noiseY) - noisedeltaY) / 100) * Time.timeScale;
rotationYtemp += (touch.deltaPosition.y * sensitivityY * sensitivity) + (noisedeltaY);
rotationY += ((rotationYtemp - rotationY) / 3) * Time.timeScale;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (new Vector3 (-rotationY, rotationX, 0)), 9f * Time.deltaTime);
}
}
}
slider_finger_id = touch.fingerId;
}
if (touch.phase == TouchPhase.Ended && slider_finger_id == touch.fingerId)
{
slider_finger_id = -1;
}
}
}
Related
in Unity I have a camera as a child of a 2D gameobject (to follow it around). There is an IF statement that lets me move the camera ahead by holding down a key. I need a code to return the camera back to the gameobject after I let go. Thank you for the help.
public class camera : MonoBehaviour
{
public float panspeed = 30f;
public float panBorderThickness = 30f;
public GameObject ship1;
private Vector3 offset;
void Update()
{
if (Input.GetKey("f"))
{
Vector3 pos = transform.position;
if (Input.mousePosition.y >= Screen.height - panBorderThickness)
{
pos.y += panspeed * Time.deltaTime;
}
if (Input.mousePosition.y <= panBorderThickness)
{
pos.y -= panspeed * Time.deltaTime;
}
if (Input.mousePosition.x >= Screen.width - panBorderThickness)
{
pos.x += panspeed * Time.deltaTime;
}
if (Input.mousePosition.x <= panBorderThickness)
{
pos.x -= panspeed * Time.deltaTime;
}
transform.position = pos;
}
//something to return the camera back when i let go of F key
}
}
If I understand correctly you would want to smoothly move the camera back to its original position so I would probably do it like
private void Update ()
{
if (Input.GetKey(KeyCode.F))
{
var pos = transform.position;
if (Input.mousePosition.y >= Screen.height - panBorderThickness)
{
pos.y += panspeed * Time.deltaTime;
}
if (Input.mousePosition.y <= panBorderThickness)
{
pos.y -= panspeed * Time.deltaTime;
}
if (Input.mousePosition.x >= Screen.width - panBorderThickness)
{
pos.x += panspeed * Time.deltaTime;
}
if (Input.mousePosition.x <= panBorderThickness)
{
pos.x -= panspeed * Time.deltaTime;
}
transform.position = pos;
}
else
{
transform.position = Vector3.MoveTowards(transform.position, ship1.transform.position - ship1.transform.forward * 10, panspeed * Time.deltaTime);
}
}
if(Input.GetKeyUp("f")){
transform.position = ship1.transform.position;
}
Sidenote, you can't assign values to only one component of a vector. You need to reassign the entire vector with the new component or add/subtract to the original vector. Your script should look like
if (Input.GetKey("f"))
{
Vector3 pos = transform.position;
if (Input.mousePosition.y >= Screen.height - panBorderThickness)
{
pos += new Vector3(0, panspeed * Time.deltaTime, 0);
}
if (Input.mousePosition.y <= panBorderThickness)
{
pos -= new Vector3(0, panspeed * Time.deltaTime, 0);
}
if (Input.mousePosition.x >= Screen.width - panBorderThickness)
{
pos += new Vector3(panspeed * Time.deltaTime, 0, 0);
}
if (Input.mousePosition.x <= panBorderThickness)
{
pos -= new Vector3(panspeed * Time.deltaTime, 0, 0);
}
transform.position = pos;
}
if(Input.GetKeyUp("f"))
{
transform.position = GameObjectYouWant.transform.position;
}
Goal:
to create a vehicle with properties similar to that of Mario Kart 8's anti gravity mode, or f- zero; the ability to ride on extreme non horizontal surfaces.
Desired behavior:
the vehicle should not turn unless the thumbstick or arrow keys are pressed/moved; it must keep a straight line of motion with the exception of roll and vertical curvature relative to the camera's view.
Actual behavior:
The vehicle will slowly(sometimes quickly) fall out of line and keep curving until the track stops bending. if placed in an inward facing cylinder and driven around radially, the vehicle will begin to curve towards either global +z or global +y.
(no error messages)
What I've tried:
-setting transform.up to the surface normal then rotating around the normal as an axis
-using quaternion.euler(0, [desired angle], 0) then fromToRotation
The alignment and rotation code:
transform.rotation = Quaternion.Euler(0, rotation, 0);
Quaternion tilt = Quaternion.FromToRotation(Vector3.up, localUp);
transform.rotation = tilt * transform.rotation;
transform.position += velocity * 1.1f;
The entire script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using PhysicsExtensions;
using UnityEngine.Rendering.PostProcessing;
public class Cart : MonoBehaviour
{
Kartphysics inputActions;
public new Transform camera, camTarget, camTargetDrift, Visual;
public ShipType shipType;
public AudioSource Vroom;
public Vector3 localUp = Vector3.up;
Vector3 velocity, camUp, followPos;
public AnimationCurve SteeringControl;
public float steerAmount;
float rotation, rollTarget, roll, fovDifference, vroomPitch = 0, flameLength = 0;
public float normalFov, speedFov, Velocity, rollAmount, speedFactor, forcedAcceleration;
public GameObject[] ships;
public FlamingTrail[] flames;
public PostProcessProfile ppp;
Vector2 JoystickVal;
ChromaticAberration ca;
LensDistortion ld;
Vector3 LastForward;
private void Start()
{
switch (shipType)
{
case ShipType.Carrier:
{
ships[0].SetActive(true);
break;
}
case ShipType.Ram:
{
ships[1].SetActive(true);
break;
}
}
ca = ppp.GetSetting<ChromaticAberration>();
ld = ppp.GetSetting<LensDistortion>();
}
private void Update()
{
UpdateVisuals();
UpdateCamera();
Velocity = velocity.magnitude;
}
private void FixedUpdate()
{
UpdateKart();
}
void SetFlames(float length)
{
for(int i = 0; i < flames.Length; i++)
{
flames[i].length = length;
}
}
void UpdateVisuals()
{
ca.intensity.value = Mathf.Clamp01(forcedAcceleration) * 2;
ld.intensity.value = Mathf.Lerp(0, -70f, Mathf.Clamp(forcedAcceleration, 0, 1));
SetFlames(flameLength);
Vroom.pitch = Mathf.Lerp(Vroom.pitch, vroomPitch, (speedFactor * 0.01f) * 10);
Visual.position = Vector3.Lerp(Visual.position, transform.position, (speedFactor * 0.01f) * 30);
Visual.rotation = Quaternion.Lerp(Visual.rotation, transform.rotation, (speedFactor * 0.01f) * 15);
}
void UpdateCamera()
{
fovDifference = speedFov - normalFov;
Camera.main.fieldOfView = speedFov - (fovDifference * (1 / Mathf.Clamp(velocity.magnitude + 1, 0, Mathf.Infinity)));
camUp = Vector3.Lerp(camUp, localUp.normalized, (speedFactor * 0.01f) * (Vector3.Distance(camera.position, Vector3.Lerp(camTarget.position, camTargetDrift.position, transform.InverseTransformDirection(velocity).x)) + 3));
camera.rotation = Quaternion.Slerp(camera.rotation, Quaternion.LookRotation((transform.position - (transform.right * transform.InverseTransformDirection(velocity).x * 5) + transform.up) - camera.position, camUp), (speedFactor * 0.01f) * 13);
camera.position = Vector3.Lerp(camera.position, Vector3.Lerp(camTarget.position, camTargetDrift.position, transform.InverseTransformDirection(velocity).x), (speedFactor * 0.01f) * Vector3.Distance(camera.position, camTarget.position) * 20);
}
void UpdateKart()
{
JoystickVal = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
if (Input.GetAxis("Submit") > 0.5)
JoystickVal = new Vector2(JoystickVal.x, 1);
if (Input.GetAxis("Cancel") > 0.5)
JoystickVal = new Vector2(JoystickVal.x, -1);
if (JoystickVal.magnitude > 1)
{
JoystickVal.Normalize();
}
JoystickVal *= (speedFactor * 0.01f) * 0.2f;
JoystickVal /= Mathf.Clamp(velocity.magnitude, 0.7f, Mathf.Infinity);
velocity += ((transform.forward * JoystickVal.y) / Mathf.Clamp(Mathf.Abs(transform.InverseTransformDirection(velocity).x), 0.7f, Mathf.Infinity));
rollTarget = Mathf.Clamp01(SteeringControl.Evaluate(velocity.magnitude)) * JoystickVal.x * rollAmount;
roll = Mathf.MoveTowards(roll, rollTarget, (speedFactor * 0.01f) * 4);
velocity -= localUp * (speedFactor * 0.01f) * 0.7f;
velocity /= 1 + ((speedFactor * 0.01f) / 8);
RaycastHit hit;
CircleCastHit circleHit;
if (Physics.Raycast(transform.position + transform.up, -transform.up + (velocity / 1), out hit))
{
if (hit.distance < 4)
{
transform.position -= hit.normal.normalized * (speedFactor * 0.01f);
localUp = Vector3.MoveTowards(localUp, hit.normal, (speedFactor * 0.01f) * 9);
if (hit.distance < 1.2f)
{
flameLength = Velocity * 2;
if (hit.collider.tag == "SpeedPanel")
forcedAcceleration = 3f;
rotation += SteeringControl.Evaluate(velocity.magnitude * 0.7f) * JoystickVal.x * (speedFactor * 0.01f) * 100 * steerAmount;
transform.position += hit.normal.normalized * (1 - hit.distance);
vroomPitch = velocity.magnitude * 1.5f;
velocity += ((transform.forward * ((JoystickVal.y * 1.3f) + (forcedAcceleration / 100))) / Mathf.Clamp(Mathf.Abs(transform.InverseTransformDirection(velocity).x), 0.7f, Mathf.Infinity));
rotation += SteeringControl.Evaluate((speedFactor * 0.01f) * velocity.magnitude * 50) * JoystickVal.x * 0.3f;
velocity /= 1 + ((speedFactor * 0.01f));
velocity -= transform.right * transform.InverseTransformDirection(velocity).x * 0.2f;
Vector3 force = (hit.normal * -transform.InverseTransformDirection(velocity).y / Mathf.Clamp(hit.distance - 0.1f, 0.5f, 2)) * 1.1f;
if (force.magnitude > 1)
force = force.normalized * 1;
force /= 8;
velocity += force;
}
else
{
vroomPitch = 0;
flameLength = Mathf.MoveTowards(flameLength, 0, 0.03f);
}
}
else
{
localUp = Vector3.MoveTowards(localUp, Vector3.up, (speedFactor * 0.01f) * 1.2f);
vroomPitch = 0;
transform.forward = velocity.normalized;
flameLength = Mathf.MoveTowards(flameLength, 0, 0.03f);
}
}
else
{
localUp = Vector3.MoveTowards(localUp, Vector3.up, (speedFactor * 0.01f) * 2);
vroomPitch = 0;
flameLength = Mathf.MoveTowards(flameLength, 0, 0.03f);
}
if (PhysicsII.CircleCast(transform.position + (transform.up * 0.5f), localUp, 0.7f, 8, out circleHit))
{
Debug.DrawRay(circleHit.nearestHit().point, circleHit.nearestHit().normal, Color.red, 0.1f);
Debug.Log("HIT");
velocity += (transform.position + (transform.up * 0.5f) - circleHit.nearestHit().point) / 3;
if (circleHit.nearestHit().distance < 0.4f)
velocity += (transform.position + (transform.up * 0.5f) - circleHit.nearestHit().point) / 7;
if (circleHit.nearestHit().distance < 0.14f)
velocity += (transform.position + (transform.up * 0.5f) - circleHit.nearestHit().point) / 7;
}
if(Physics.Raycast(transform.position + (transform.up * 0.8f) - velocity, velocity , out hit))
{
if(hit.distance < Velocity * 2)
velocity /= 1 + ((speedFactor * 0.01f) * 2f);
if (hit.distance < Velocity * 1.2f)
velocity = Vector3.Reflect(velocity, hit.normal);
}
forcedAcceleration = Mathf.MoveTowards(forcedAcceleration, 0, 0.1f);
transform.rotation = Quaternion.Euler(0, rotation, 0);
Quaternion tilt = Quaternion.FromToRotation(Vector3.up, localUp);
transform.rotation = tilt * transform.rotation;
transform.position += velocity * 1.1f;
}
public enum ShipType
{
Carrier = 0,
Ram = 1
}
}
Here's a partial answer because I can't test it on my end currently to see if it works. It also appears like "roll" isn't yet used for anything (is it meant to alter the local up of the transform somehow?) so I'm not sure about that.
First, instead of keeping a float rotation to keep track of how the vehicle is turned, you can just use transform.forward or transform.right for those purposes, and measure the modifications to that on a per-frame basis:
void UpdateKart()
{
Vector3 newForward = transform.forward;
float turnAmount = 0f;
// ...
if (hit.distance < 1.2f)
{
flameLength = Velocity * 2;
if (hit.collider.tag == "SpeedPanel")
forcedAcceleration = 3f;
turnAmount += SteeringControl.Evaluate(velocity.magnitude * 0.7f)
* JoystickVal.x * (speedFactor * 0.01f) * 100 * steerAmount;
transform.position += hit.normal.normalized * (1 - hit.distance);
vroomPitch = velocity.magnitude * 1.5f;
velocity += /* too long to bother formatting */
turnAmount += SteeringControl.Evaluate((speedFactor * 0.01f)
* velocity.magnitude * 50) * JoystickVal.x * 0.3f;
// ...
Then when you actually adjust the rotation, apply the turn amount around the local up axis to the current local forward direction. And finally, set the transform's rotation so that its new local up is localUp and it keeps its local forward as constant a direction as possible (cross products followed by Quaternion.LookRotation can be used for this):
forcedAcceleration = Mathf.MoveTowards(forcedAcceleration, 0, 0.1f);
Vector3 turnedForward = Quaternion.AngleAxis(turnAmount - 180, localUp) *
transform.forward;
Vector3 newRight = Vector3.Cross(turnedForward, localUp);
if (newRight == Vector3.zero)
{
/* Ambiguous situation - maybe kart landed with its nose directly in the
direction of localUp or opposite direction. Possible solution: use
velocity as previous forward direction and recalculate, using a random
direction if that doesn't work
*/
newRight = Vector3.Cross(velocity, localUp);
if (newRight == Vector3.zero)
{
newRight = Vector3.ProjectOnPlane(Random.insideUnitSphere,
localUp).normalized;
}
}
Vector3 newForward = Vector3.Cross(newRight, localUp);
transform.rotation = Quaternion.LookRotation(newForward, localUp);
transform.position += velocity * 1.1f;
The reason you're seeing the results you are is that FromToRotation will give you the "smallest" rotation that will move one vector to the other. But you're more concerned with a rotation that will keep the local forward close to what they are before the adjustment (it's difficult to explain why this isn't the same thing). Hence the Cross stuff.
As I said, this is only intended to be a partial solution to get you closer. But, it may be all you need. Let me know what you think in the comments.
I'm developing a 2D isometric game just like Age of Empires 2, TTD, Into the Breach, and so on. I'm using Unity and C#
Relevant fact: i'm using a Isometric Tilemap
I want the camera limits to stay aligned with the borders of the map just like the games cited above but i'm having difficulty and i have spent so much time on this that i start to question myself if it's worth to use Isometric Tilemap or do the usual approach and just make a regular 2D game with the camera rotated.
And this is my first question: does Isometric Tilemap really worth or usual approach is better (non-isometric 2D game with rotated camera)? If so, how to do that in Unity?
Despite that,the code i've implemented follow below but it have two bugs:
Camera get stuck on firstBase and thirdBase if the user press right/left key and up/down arow keys
If the camera is moving on the border it may escape it
void Start(){
CameraMovement_Limits();
}
void CameraMovement_Limits(){
Vector3 gridOrigin = tilemapFloor.GetCellCenterWorld(tilemapFloor.origin);
float gridHypotenuse = ((tilemapFloor.size.x - 1) * tilemapFloor.cellSize.y);
homePlate = gridOrigin + new Vector3(0, 0, -10);
firstBase = gridOrigin + new Vector3(gridHypotenuse, gridHypotenuse/2, -10);
secondBase = gridOrigin + new Vector3(0, gridHypotenuse, -10);
thirdBase = gridOrigin + new Vector3(-gridHypotenuse, gridHypotenuse/2, -10);
}
void Update(){
CameraDiagonalMovement();
}
bool CheckCameraPosition(Vector2 p1, Vector2 p2, Vector2 pos){
//This is what this function do:
//find the linear equation for the line formed by 'p1' and 'p2' coordinates
//insert 'pos' coordinate on the equation and stores the result in 'ind'
//if 'ind' is positive, it means that 'pos' is above the line
//if its negative, its above
//if its zero, its on the line
//resuming, this funtion tells if 'pos' is above or below a line formet by 'p1' and 'p2'
float a = (p1.y - p2.y) / (p1.x - p2.x);
float ind = pos.y - p2.y - (a * (pos.x - p2.x));
return ind >= 0;
}
void CameraDiagonalMovement(){
Vector3 vecZero = Vector2.zero;
camPos = (Vector2)transform.position;
//Going to the left
if(Input.GetAxis("Vertical") < 0){
if(CheckCameraPosition(homePlate, thirdBase, camPos) && CheckCameraPosition(homePlate, firstBase, camPos)){
vecZero.y = Input.GetAxis("Vertical");
}else if(!CheckCameraPosition(homePlate, thirdBase, camPos) && CheckCameraPosition(homePlate, firstBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f * -1;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}else if(CheckCameraPosition(homePlate, thirdBase, camPos) && !CheckCameraPosition(homePlate, firstBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}
}
//Going to the right
if(Input.GetAxis("Vertical") > 0){
if(!CheckCameraPosition(secondBase, thirdBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.y = Input.GetAxis("Vertical");
}else if(CheckCameraPosition(secondBase, thirdBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}else if(!CheckCameraPosition(secondBase, thirdBase, camPos) && CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f * -1;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}
}
//Going down
if(Input.GetAxis("Horizontal") < 0){
if(CheckCameraPosition(homePlate, thirdBase, camPos) && !CheckCameraPosition(secondBase, thirdBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal");
}else if(!CheckCameraPosition(homePlate, thirdBase, camPos) && !CheckCameraPosition(secondBase, thirdBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f * -1;
}else if(CheckCameraPosition(homePlate, thirdBase, camPos) && CheckCameraPosition(secondBase, thirdBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f;
}
}
//Going up
if(Input.GetAxis("Horizontal") > 0){
if(CheckCameraPosition(homePlate, firstBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal");
}else if(CheckCameraPosition(homePlate, firstBase, camPos) && CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f * -1;
}else if(!CheckCameraPosition(homePlate, firstBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f;
}
}
Vector3 newPos = new Vector3(vecZero.x, vecZero.y, 0);
transform.position += newPos * velocity * Time.deltaTime;
}
I want to make a code with endless 3d car game, car control by swipe left and right. without using any physics.
info.
3-lane,specific lane center (9,0,car z position),(0,0,car z position),(-9,0,car z position).
I do swipe control and move swipe control but not good.
public class playercontrol: MonoBehaviour {
public void Update() {
playera.transform.Translate((Vector3.forward * speed * Time.deltaTime));
Debug.Log("speed" + speed);
if (check == false) {
if (Input.GetMouseButtonDown(0)) {
Debug.Log("left button");
firstPressPos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
}
if (Input.GetMouseButtonUp(0)) {
secondPressPos = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
currentSwipe = new Vector2(secondPressPos.x - firstPressPos.x, secondPressPos.y - firstPressPos.y);
currentSwipe.Normalize();
//swipe left
if (currentSwipe.x < -1.0 f && currentSwipe.y > -0.5 f && currentSwipe.y < 0.5 f) {
Debug.Log("left swipe");
if (transform.position.x > -9 f) {
spos = transform.position;
Debug.Log("spos" + spos);
endpos = new Vector3(transform.position.x - 9 f, transform.position.y, transform.position.z + ((speed * 2) / 20));
Debug.Log("speed......... ......." + ((speed * 5) / 20));
transform.rotation = Quaternion.Euler(0, -10.0 f, 0);
check = true;
//endpos * (Time.deltaTime*0.5f);
// Time.timeScale = 0.5f;
// to.rotation = Quaternion.Euler (0, 0, 0);
}
}
//swipe right
if (currentSwipe.x > 1.0 f && currentSwipe.y > -0.5 f && currentSwipe.y < 0.5 f) {
Debug.Log("right swipe");
if (transform.position.x < 9 f) {
Debug.Log("spos1" + spos);
spos = transform.position;
endpos = new Vector3(transform.position.x + 9 f, transform.position.y, transform.position.z + ((speed * 2) / 20));
Debug.Log("speed1......... ......." + ((speed * 5) / 20));
transform.rotation = Quaternion.Euler(0, 10.0 f, 0);
check = true;
// Time.timeScale = 0.5f;
// to.rotation = Quaternion.Euler (0, 0, 0);
}
}
}
}
if (check == true) {
time += 10 * Time.deltaTime;
transform.position = Vector3.Lerp(spos, endpos, time);
// transform.rotation = Quaternion.Lerp (from.rotation, to.rotation, time);
if (time > 1) {
transform.rotation = Quaternion.Euler(0, 0, 0);
//Time.timeScale = 1.0f;
//playera.transform.Rotate (0, 0, 0);
//transform.Rotate (0, 0, 0);
check = false;
time = 0;
}
}
}
}
I made the precursor to my 3d Agario game. It is a mouse-oriented game. You use the mouse to control most of the movement. This includes the rotation of the Camera.
My problem is the Camera won't stop rotating. This is because it is very hard to center the mouse to the center of the screen, and the way I made the Camera rotate is by using a Sine equation.
Here is my code:
//public
public GameObject player;
public float rotationSpeed;
//v3
private Vector3 mousePos;
private Vector3 playerPos;
private Vector3 camPos;
//float
private float sideX;
private float sideZ;
private float sideC;
private float camX;
private float camZ;
private float camC;
private float rotX;
private float rotZ;
private float rotC;
private float rotAngle;
private Quaternion currRotation;
//camera
private Camera hitCam;
void Start ()
{
transform.rotation = Quaternion.Euler(30, 0, 0);
transform.position = new Vector3(0, 15, 0);
}
void LateUpdate ()
{
mousePos = HitCameraController.mousePos;
playerPos = player.transform.position;
sideX = (mousePos.x - playerPos.x);
sideZ = (mousePos.z - playerPos.z);
sideC = (Mathf.Sqrt(Mathf.Pow(sideX, 2) + Mathf.Pow(sideZ, 2)));
camC = 15;
camX = (camC * sideX) / sideC;
camZ = (camC * sideZ) / sideC;
rotX = (sideX + camX);
rotZ = (sideZ + camZ);
rotC = (Mathf.Sqrt(Mathf.Pow(rotX, 2) + Mathf.Pow(rotZ, 2)));
if (rotX >= 0 && rotZ >= 0)
{
rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
if (rotX >= 0 && rotZ <= 0)
{
rotAngle = 180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
if (rotX <= 0 && rotZ >= 0)
{
rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
if (rotX <= 0 && rotZ <= 0)
{
rotAngle = -180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
camPos = new Vector3((playerPos.x - camX), 15, (playerPos.z - camZ));
currRotation = Quaternion.Euler(30, rotAngle, 0);
// Move Camera
transform.position = camPos;
// Rotate Camera
/*transform.rotation = Quaternion.RotateTowards(
transform.rotation, currRotation,
(rotationSpeed * Time.deltaTime));*/
transform.rotation = currRotation;
}
I want to make a sort of "safe-zone" that will prevent the calculation of the rotating angle. For instance, if I keep my mouse within a certain boundary in the center, the Camera won't rotate.
I tried to make the boundary using an "or" statement, but it didn't give me the result I was looking for (the camera would still rotate even when my mouse was in the boundary. The Camera would stop on some tries, but it would jitter immensely before doing so.)
I know exactly why this is occurring: the ray isn't being cast on a still camera; hence, the mouse coordinate will always change, even if I don't move the mouse. I tried casting the ray to the "Hit" camera (the still Camera), but the follow camera couldn't pick up on the mouse movement. I don't know how to fix this problem other than to keep brainstorming for an intuitive solution, but my brain can only innovate so much.
If you could think of a solution before me, let me know by any means.
[...]
void LateUpdate ()
{
mousePos = HitCameraController.mousePos;
playerPos = player.transform.position;
sideX = (mousePos.x - playerPos.x);
sideZ = (mousePos.z - playerPos.z);
sideC = (Mathf.Sqrt(Mathf.Pow(sideX, 2) + Mathf.Pow(sideZ, 2)));
// New Stuff
sideC -= 5f; // substract the safe-zone-radius
if(sideC < 0f)
{
// Inside safe-zone, do nothing.
sideC = 0f;
sideX = 0f;
sideZ = 0f;
}else{
// Outside safe-zone, correct values to avoid jumping.
float x_ratio = sideX / sideZ; // be careful with "divide by zero"
float z_ratio = sideZ / sideX;
sideX -= 5 * x_ratio;
sideZ -= 5 * z_ratio;
}
// End New Stuff
camC = 15;
camX = (camC * sideX) / sideC;
camZ = (camC * sideZ) / sideC;
rotX = (sideX + camX);
rotZ = (sideZ + camZ);
rotC = (Mathf.Sqrt(Mathf.Pow(rotX, 2) + Mathf.Pow(rotZ, 2)));
if (rotX >= 0 && rotZ >= 0)
{
rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
if (rotX >= 0 && rotZ <= 0)
{
rotAngle = 180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
if (rotX <= 0 && rotZ >= 0)
{
rotAngle = (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
if (rotX <= 0 && rotZ <= 0)
{
rotAngle = -180 - (Mathf.Asin(rotX / rotC) * Mathf.Rad2Deg);
}
camPos = new Vector3((playerPos.x - camX), 15, (playerPos.z - camZ));
currRotation = Quaternion.Euler(30, rotAngle, 0);