Getting PS3 controller input in Unity3D - c#

I want my PS3 controller to control my unity game, and so far it isn't going well. I have it plugged into my computer via the USB cable it came with. My computer did not install any drivers when I plugged it in, but it did make a sound and Unity seems to have detected it, printing Joystick Connected (controller name here)
Unfortunately, beyond that the controller does absolutely nothing. I have gone to the input menu and have adjusted input according to this map: http://forum.unity3d.com/threads/ps3-button-map.89288/
but still get nothing. Not a single button does anything.
I should also mention if this helps, this is how I'm getting input:
void FixedUpdate()
{
float movehorizontal = Input.GetAxis("Horizontal");
float movevertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(movehorizontal, 0, movevertical);
rb.AddForce(movement * speed);
}

You need a special driver in order to get your PS3 controller to work on PC. I highly recommend ScpToolkit. It's the best one out there.

Related

Unity3D: Player accelerates indefinitely when jumping

Hello people,
I have a problem with my PlayerController in Unity3D. As stated in the title my player accelerates indefinitely when pressing the "jump"-key. My real problem here is, that this is only the case if I export the scenes and then start the game. If I just start the scene in the Unity Editor everything just works fine. So its probably not the code?
I do recall, that a friend of mine experienced the same problem a while ago while testing one of the earlier versions of the game while I couldn't reproduce it on my machine. Unfortunatly he didn't have time to review this version until now.
Just since I switched to a new developing station I experience that problem.
If I run the game on my laptop it runs just fine (not mentioning the 3 FPS I have, but it does work ^^).
All 4 PCs mentioned above run Windows 10, if that helps.
This is the code I use for my jump method:
private void Jump()
{
if (groundDetector.currentCollisions.Count != 0)
{
Vector3 vel = new Vector3(rigidbody.velocity.x, 0, rigidbody.velocity.z);
rigidbody.velocity = vel;
Vector3 jumpForce = new Vector3(0, jumpPower, 0);
rigidbody.AddForce(jumpForce, ForceMode.Impulse);
}
}
I would be really thankfull if someone could help my with this problem, since I already spend some hours of googling time and didn't find a clue at all, noone seems to have the same problem...
Thanks in advance!
Lukas

Issue with moving clients/players with Photon Networking in Unity

I'm making a game where players are put onto plates and random events happen to the plates/players. I've gone through a multitude of different networking solutions like UNET, Mirror, Mirror+Steamworks P2P but none of them really worked well (main issue being not being able to join via IP) so I settled on Photon. After Punv2 just wouldn't work on my project (an error in PhotonEditor.CS) I just used Punv1 which is working perfectly for the most part.
The issue right now is that I'm trying to spawn players on their owned plates but they only spawn on the first plate despite each plate being owned by a player (each plate has a script that specifies which player 'owns' it. This is being set correctly). This only seems to happen when I try to test with a real player/client. If I create a fake player by just spawning in the prefab and then running it, both players will be moved to their correct plate so it seems to be a networking issue.
Here's the code responsible for moving the players to their plates.
foreach (GameObject plate in spawnedPlates)
{
//Here we loop through each plate, get the player assigned to it and move the player to that plate.
GameObject player = plate.GetComponent<Plate>().assignedTo;
PlayerClientControl playerController = player.GetComponent<PlayerClientControl>(); // originally for UNET/Mirror. Left in incase I need it(had an RPC function that moved the player).
player.transform.position = plate.transform.position + new Vector3(0, 4, 0);
}
What am I doing wrong?
EDIT:
It seems they ARE being moved to the correct positions (or atleast, it's trying to move them to the correct position) via a debug print statement that prints where they are trying to be teleported to further cementing that this is a networking issue but I have no idea how to fix it.
I assume it's something to with host/client synchronization? If anyone could shed some light on this, that'd be great because I'm pulling my hair out over this.
If you inspect the player objects at runtime, it will probably give you a clue. I had the same and in my case I had InputAction attached to my players (taken from unity StarterAssets). The first player in the game was assigned keyboard and the second a controller. I solved it by disabling all the inputaction and enabling the one of the localplayer:
private void Awake()
{
photonView = GetComponent<PhotonView>();
if (photonView.IsMine)
{
// take control of the user input by disabling all and then enabling mine
var players = FindObjectsOfType<Player>();
foreach (Player player in players)
{
player.GetComponent<PlayerInput>().enabled = false;
}
GetComponent<PlayerInput>().enabled = true;

Unity Gaze Input for GearVR

Okay, so, I got the challenge to create a program, in Unity for GearVR.
I have to make a program which makes use of gaze input, so if you stare at an object for several seconds it'll display you a 360* video.
I barely can't find any GearVR Gaze Input tutorials around on the web so I wanted to give it a shot on Stackoverflow, and hopefully someone could help me out! :)
You have to use Physics.Raycast. This method emits a ray from the camera point to the camera orientation. You can use something like that:
// Does the Ray hit an object with a component named MyObjectScript?
RaycastHit hit;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, out hit) )
{
var script = hit.transform.GetComponent<MyObjectScript>();
if (script != null)
{
//Do your stuff...
}
}
Simply put this script on your camera in the FixedUpdate method and another script named MyObjectScript in the object you want to detect.

Unity Multiplayer FPS Client/Server Interaction Problems

I have a simple FPS where a player can fire a gun. I want the clients to see the bullet holes. I am trying to accomplish this by invoking a server side method when the client tries to fire the gun. The server side method should then raycast from the players camera and spawn a bullet hole for everyone to see..
I can get this to work partially by passing the player as a parameter to the server method. However, since my raycasting needs to be done based off the player camera, the bullet holes end up appearing at character height, since it's using the player and not the camera.
It won't allow me to pass a camera through. I have also tried creating an empty game object called bullet spawn and passing that through but I was getting a "object reference not set to instance of an object." This same error seems to surface for any Child element of the player I attempt to pass to the server side method.
I am unsure of the right way to accomplish this.
void Update()
{
if (isLocalPlayer)
{
if (Input.GetButton("Fire1"))
{
CmdFire(BulletSpawn);
}
}
}
[Command]
void CmdFire(GameObject Player)
{
Ray shooterRay = new Ray(Player.transform.position, Player.transform.forward);
if (Physics.Raycast(shooterRay, out Hit, 10000))
{
Debug.Log("player hit");
GameObject Bullet_Hole = (GameObject)Instantiate(BulletHole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point));
NetworkServer.Spawn(Bullet_Hole);
}
}
Think about it this way. What is it that you need to fire your weapon? You need the firing point and the firing direction (in your simple case). So try to pass just that information. Your CmdFire should look like void CmdFire(Vector3 firingPoint, Vector3 firingDirection). Remember that when you pass the player gameobject, it gets serialized and sent to the server which causes a lot of unneeded network traffic. Stick to value types and simple objects for commands.
This is what ultimately led me to the solution. Thank you for the advice. I simply passed two Vector3 parameters as you suggested which represent the raycast position and direction. I can now shoot from both client and server and see the bullet holes on both as well. Here is the code that fixed it in case anyone runs into this later on:
void Update() {
if (isLocalPlayer) {
if (Input.GetButton("Fire1")) {
Vector3 FiringSpot = PlayerCam.transform.position;
Vector3 FireDirection = PlayerCam.transform.forward;
CmdFire(FiringSpot, FireDirection);
}
}
}
[Command]
void CmdFire(Vector3 firingPoint, Vector3 firingDirection) {
Ray shooterRay = new Ray(firingPoint, firingDirection);
if (Physics.Raycast(shooterRay, out Hit, 10000)) {
GameObject Bullet_Hole = (GameObject)Instantiate(bullet_Hole_Prefab, Hit.point, Quaternion.FromToRotation(Vector3.up, Hit.point));
NetworkServer.Spawn(Bullet_Hole);
Destroy(Bullet_Hole, 10);
}
}

Own function should run every frame, how is this possible?

I created an own function within a script which should be executed as soon as there is a collision (using OnCollisionEnter).
The idea would be the following:
I have a ring which is steered by the key of the keyboard (Up and Down). Then I produced a sine wave wire with spheres which are moving from right to the left(in a sine wave manner). The player should not be able to move the ring trough the wire.
Therefore I add two colliders to the ring (an Up and a Down collider) and a collision script.
The problem is that sometimes the ring can me moved through the wire... when I press the Up key all the time. Even worse when I do nothing, then the ring should slides along the wire... but it does not.
I think the problem is related to the fact, that my own function is not executed every frame. Or what do you think? How can I execute my own function every frame?
Here the code of the collision script:
void OnCollisionEnter(Collision collUP)
{
if (collUP.gameObject.name == "Sphere(Clone)") {
Debug.Log ("Kollidiert mit UP");
controller.MoveRingDown ();
}
}
And here the code of the ring script in which I created an own function:
public void MoveRingDown() {
transform.position = transform.position + new Vector3 (0f, -tilt, 0f);
}
public void MoveRingUp() {
transform.position = transform.position + new Vector3(0f, tilt, 0f);
}
OnCollisionEnter is only called once, when the collision produces ( as its names reads ). I think what you need is OnCollisionStay, which is executed while the collision lasts.

Categories

Resources