개인적인 공부/Unity

C# Input.GetAxis()

karatejin 2023. 1. 10. 21:48

들어가기전

Input System: converting the player's physcial action(eg. button press, keypress) into Info for the game.

old system 과 new system 이 있단다 그런가보다

 

Old System

Edit 의 Project Settings

 

Input Manager 의 Axes 늘 선택하자

Axes 는 Axis 의 복수형이란다. 도끼의 복수형인줄  알았다.

이 두개를 건드는건가 보다.
이거다.

Horizontal 과 Vertical 은 두개가 있는데 다른 하나는 조이스틱용이다. 난 건들지 않는다. 

안좋은점 한가지 : 명칭을 정확하게 알아야 한다. 범위 값이 - 1부터 +1 까지 즉 (-1, 0 , +1) 3가지인가 보다.

    void Update() //프레임마다 호출된다.
    {
        float steerAmount = Input.GetAxis("Horizontal");
        transform.Rotate(0,0,steerAmount);
        transform.Translate(0,moveSpeed,0);
    }
}

코드를 추가 한다. * 철자가 틀리면 작동이 안된다.

 

키보드 값을 입력하면 이동한다.

하지만 우리가 원하는 방향과 반대로 움직인다.

    void Update() //프레임마다 호출된다.
    {
        float steerAmount = Input.GetAxis("Horizontal")  * steerSpeed;
        transform.Rotate(0,0,-steerAmount);
        transform.Translate(0,moveSpeed,0);
    }
}

 

진행방향 기준으로 오른쪽 갈때 오른쪽 왼쪽갈때 왼쪽
 void Update() //프레임마다 호출된다.
    {
        float steerAmount = Input.GetAxis("Horizontal") * steerSpeed;
        float moveAmount = Input.GetAxis("Vertical") * moveSpeed;
        transform.Rotate(0,0,-steerAmount);
        transform.Translate(0,moveAmount,0);
        
    }

Vertical 을 따로 - 안줘도 바른 방향으로 간다.

 

p.s. 1

New System을 안가르쳐 주네 이 洋兄이

 

p.s. 2

내가 배움이 일천하여 Java 로 만든 엔진이 있는줄 모르겠다. 그래서 자바는 노가다 중에 노가다다.

KeyHandler 를 가져와서 다 세팅 해줘야 한다.

package main;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class KeyHandler implements KeyListener {
	
	public boolean upPressed, downPressed, leftPressed, rightPressed;

	@Override
	public void keyTyped(KeyEvent e) {
	}

	@Override
	public void keyPressed(KeyEvent e) {
		
		int code = e.getKeyCode();
		
		if (code == KeyEvent.VK_W){
			upPressed = true;
		}
		if (code == KeyEvent.VK_S){
			downPressed = true;
		}
		if (code == KeyEvent.VK_A){
			leftPressed = true;
		}
		if (code == KeyEvent.VK_D){
			rightPressed = true;
		}
		
	}
	@Override
	public void keyReleased(KeyEvent e) {

		int code = e.getKeyCode();
		
		if (code == KeyEvent.VK_W){
			upPressed = false;
		}
		if (code == KeyEvent.VK_S){
			downPressed = false;
		}
		if (code == KeyEvent.VK_A){
			leftPressed = false;
		}
		if (code == KeyEvent.VK_D){
			rightPressed = false;
		}

	}

}

Key Setting 이 끝났으면 player에게도 적용을 해줘야한다.

package entity;

import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

import main.GamePanel;
import main.KeyHandler;

public class Player extends Entity {

	GamePanel gp;
	KeyHandler keyH;

	public final int screenX;
	public final int screenY;

	public Player(GamePanel gp, KeyHandler keyH) {

		this.gp = gp;
		this.keyH = keyH;

		screenX = gp.screenWidth / 2 - (gp.tileSize / 2);
		screenY = gp.screenHeight / 2 - (gp.tileSize / 2);

		solidArea = new Rectangle();
		solidArea.x = 8;
		solidArea.y = 16;
		solidAreaDefaultX = solidArea.x;
		solidAreaDefaultY = solidArea.y;
		solidArea.width = 32;
		solidArea.height = 32;

		setDefaultValues();
		getPlayerImage();
	}

	public void setDefaultValues() {

		worldX = gp.tileSize * 23;
		worldY = gp.tileSize * 21;
		speed = 4;
		direction = "down";
	}

	public void getPlayerImage() {

		try {

			up1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_up_1.png"));
			up2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_up_2.png"));
			down1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_down_1.png"));
			down2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_down_2.png"));
			left1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_left_1.png"));
			left2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_left_2.png"));
			right1 = ImageIO.read(getClass().getResourceAsStream("/player/boy_right_1.png"));
			right2 = ImageIO.read(getClass().getResourceAsStream("/player/boy_right_2.png"));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void update() {

		if (keyH.upPressed == true || keyH.downPressed == true || keyH.leftPressed == true
				|| keyH.rightPressed == true) {
			if (keyH.upPressed == true) { // 4픽셀 이동
				direction = "up";

			} else if (keyH.downPressed == true) {
				direction = "down";

			} else if (keyH.leftPressed == true) {
				direction = "left";

			} else if (keyH.rightPressed == true) {
				direction = "right";

			}

			// CHECK TILE COLLISION
			collisionOn = false;
			gp.cChecker.checkTile(this);
			
			//CHECK OBJECT COLLISION
			int objIndex = gp.cChecker.checkObject(this, true);

			// IF COLLISION IS FALSE, PLAYER CAN MOVE
			if (collisionOn == false) {

				switch (direction) {
				case "up": worldY -= speed; break;
				case "down": worldY += speed; break;
				case "left": worldX -= speed; break;
				case "right": worldX += speed; 	break;
				}
			}

			spriteCounter++;
			if (spriteCounter > 12) {
				if (spriteNum == 1) {
					spriteNum = 2;
				} else if (spriteNum == 2) {
					spriteNum = 1;
				}
				spriteCounter = 0;
			}
		}

	}

	public void draw(Graphics2D g2) {

//		g2.setColor(Color.white);
//		g2.fillRect(x, y, gp.tileSize, gp.tileSize);

		BufferedImage image = null;

		switch (direction) {
		case "up":
			if (spriteNum == 1) {
				image = up1;
			}
			if (spriteNum == 2) {
				image = up2;
			}
			break;
		case "down":
			if (spriteNum == 1) {
				image = down1;
			}
			if (spriteNum == 2) {
				image = down2;
			}
			break;
		case "left":
			if (spriteNum == 1) {
				image = left1;
			}
			if (spriteNum == 2) {
				image = left2;
			}
			break;
		case "right":
			if (spriteNum == 1) {
				image = right1;
			}
			if (spriteNum == 2) {
				image = right2;
			}
			break;
		}
		g2.drawImage(image, screenX, screenY, gp.tileSize, gp.tileSize, null);
	}

}

결론 : Java 로는 하지말자 인간적으로. 엔진이 있음에 감사하자.