HTML(Hiper text make language)
HTML은 바로 그 웹의 최소 단위인 웹페이지를 만드는 언어입니다

 

html 파일은 기본적으로 아래와 같은 구조

html  파일 구조



1.  <!DOCTYPE html> HTML 문서 버전을 선언하는 내용이다.
웹 브라우저에게 나는 어떤 버전의 HTML로 작성되었는지 알려주는 것이다. 영어에 비유하자면 영국식 영어인지 미국식 영어인지 알려주는 뭐 그런 셈이다. HTML은 계속 발전해오면서 여러 버전을 거쳤다. 최신 버전은 HTML5이다. 그래서 HTML 관련 책들을 보면 HTML5라고 말하는 것이다. HTML5 이전 버전에서는 <!DOCTYPE html>이라고 선언하지 않는다.

2. <html> ~ </html>html 코드 영역을 알려주는 것이다.
HTML
은 태그라는 것을 사용하는데 항상 시작표시와 끝 표시가 있다. 시작과 끝 모두 동일한 단어를 사용하는데 끝 부분에만 '/'를 추가한다. <html>태그는 <head> <body>를 감싸고 있다.


3. <head> ~ </head>는 웹브라우저에게 여러 부가적인 내용을 알려주는 영역이다.
설문지에 빗대어 보겠다. 설문지를 작성하기 전에 이름, 나이, 연락처, 주소 등을 쓴다고 해보자. 그럼 이름, 나이, 연락처, 주소를 적는 영역이 <head>에 해당하고 질문과 답변 있는 영역이 <body>에 해당한다. 설문 조사하는 사람 입장에서는 설문 응답 내용이 본 내용이고 관심이 가는 부분이다. 설문 응답 내용을 보다가 이런 답변을 남김 사람은 대체 누구야? 라는 물음이 생길 때 이름, 나이, 연락처 등을 확인하 수 있다.

4. <body> ~ </body>는 웹페이지 내용이다. 본 내용이 담겨있다. 우리가 보는 웹 페이지 모습은 <body> 내에 적힌 내용을 웹 브라우저가 해석하여 표현해주고 있는 것이다.


 

 

<!DOCTYPE html> : 현재 문서가 HTML5 문서임을 명시

 <html> : HTML 문서의 루트(root) 요소를 정의

 <head> : HTML 문서의 메타데이터(metadata) 정의

- 메타데이터(metadata) HTML 문서에 대한 정보(data) 브라우저에는 직접적으로 표현되지 않는 정보를 의미
-
이러한 메타데이터는 <title>, <style>, <meta>, <link>, <script>, <base>태그 등을 이용하여 표현가능.

'프로그래밍 > HTML' 카테고리의 다른 글

1. DOM  (0) 2019.07.13

데코레이터 클래스는 CalculateRawConditionValue 함수를 상속받아 원하는 조건이 달성됐는지 파악하도록 설계됐다.
이 함수는 const로 선언돼 데코레이터 클래스의 멤버 변수 값을 변경할 수 없다.

이를 재정의해서 달성했는지 파악한다.

캐릭터의 델리게이트 설정이 완료되면 태스크에서 람다 함수를 해당 델리게이트에 등록하고 Tick 함수 로직에서
이를 파악해 FinishLatentTask 함수를 호출함으로써 태스크를 종료하도록 구현한다

 

 

'Unreal > Game 2 ' 카테고리의 다른 글

10.2 AI 추격  (0) 2019.07.02
10.1 AI 정찰  (0) 2019.07.02
10. AI 만들기  (0) 2019.07.01
9.3 PlayerState - 작성 중  (0) 2019.06.30
9.2 플레이어 HUD  (0) 2019.06.30

응집도

응집도는 모듈 내부에 존재하는 구성 요소들 사이의 밀접한 정도를 나타냅니다. 즉 하나의 모듈 안에서 구성 요소들 간에 똘똘 뭉쳐 있는 정도를 말합니다. 응집도가 높을수록 구성 요소들이 꼭 필요한 것들로만 모여 있고, 낮을수록 서로 관련성이 적은 요소들이 모여 있습니다. 

 

 

 

 응집도 종류

이러한 응집도는 아래와 같이 다양한 기준으로 모듈을 구성할 수 있고 그에 따라 응집도와 품질이 달라집니다.

 

 

기능적 응집도 

모듈 내부의 모든 기능 요소들이 단일 문제와 연관되어 수행될 경우의 응집도

 

순차적 응집도 

모듈 내의 하나의 활동으로부터 나온 출력 데이터를 그 다음 활동의 입력 데이터로 사용할 경우의 응집도

 

환적 응집도 

동일한 입력과 출력을 사용하여 서로 다른 긴으을 수행하는 구성 요소들이 모여 있을 경우의 응집도

 

절차적 응집도 

모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행할 경우의 응집도

 

시간적 응집도 

특정 시간에 처리되는 몇 개의 기능을 모아 하나의 모듈로 작성할 경우의 응집도

 

논리적 응집도 

유사한 성격을 가지거나 특정 형태로 분류되는 처리요소들로 하나의 모듈이 형성되는 경우의 응집도

 

우연적 응집도 

모듈 내부의 각 구성요소들이 서로 관련 없는 다른 기능을 수행하는 경우의 응집도



결합도(Coupling)



먼저 결합도에 대해 알아보고 진행하겠습니다. 한 모듈과 다른 모듈 간의 상호 의존도 또는 연관 관계입니다. 
쉽게 말해서 얼마나 클래스간에 연결이 되어 있는지 나타내는 것 입니다.
A클래스와 B클래스가 연관이 있다고 합시다.

A클래스가 변경이 된다고 한다면 B클래스도 당연히 변경이 되어야 합니다. 

그 이유는 A와 B 클래스가 연관되어 있기 때문에 당연히 A가 변경이 되면 B도 변경이 이루어져야 합니다.

만약 큰 프로젝트를 진행했다고 한다면 연결된 것이 많으면 많을수록 그만큼 변경해야 하는 것도 많아집니다.

 

 

결합도가 높은 시스템은 당연히 유지보수가 어렵습니다.

결합도를 낮추기 위한 방법이 있습니다.




1. 
다형성

결합도를 낮추는 방법 중 하나인 다형성은 객체지향 언어의 핵심 개념입니다. 

여러 행태를 가질 수 있는 능력을 말합니다. 상속이나 메소드 재정의 인터페이스를 통해 이루어 집니다.

하지만 이 방법도 어느정도의 코드 수정이 필요합니다. 그래도 이 전보다는 결합도도 낮아지고 

유지보수도 쉬워졌다고할 수 있습니다. 


2. 디자인 패턴

또 다른 방법은 Factory 패턴을 사용하는 것입니다. 

클라이언트에서 사용할 객체 생성을 캡슐화합니다. 즉 객체 생성을 위한 클래스를 하나 더 만들어

그 곳에서 클라이언트 요청에 따라 객체 생성을 다르게 하는 것입니다.

 





출처: https://nackwon.tistory.com/

'프로그래밍 > C++' 카테고리의 다른 글

심볼 Symblos  (0) 2019.07.05
절차지향 + 객체지향  (0) 2019.05.01
페이지 폴트 + 가상메모리 시스템  (0) 2019.05.01
CAST 종류 + RTTI  (0) 2019.04.30
virtual 순수가상함수 + 가상함수테이블  (0) 2019.04.30

디버그 심볼(영어: debug symbol)은 주어진 실행 가능한 모듈에서 특정한 기계어에 의해 생성된 프로그래밍 언어 구조를 표현하는 정보이다. 

가끔 심볼릭 정보는 모듈의 바이너리 파일 또는 나뉘어서 배포되는 파일과 함께 컴파일되거나 컴파일 또는 링킹 시에 버려진다. 

이 정보는 심볼릭 디버거를 사용하는 사람이 변수나 원본 소스 코드에서의 루틴들의 이름 같은 바이너리에 관한 추가적인 정보를 얻게 한다. 이 정보는 충돌한 응용 프로그램을 조사하거나 고칠 때 큰 도움이 될 수 있다.

디버그 심볼이 바이너리 자체에 삽입되면 파일은 상당히 커질 수 있다.
이 추가적인 크기를 줄이기 위해, 현대의 컴파일러는 심볼릭 정보를 분리된 파일에 출력한다. 
마이크로소프트에서 이 파일은 PDB라고 불린다. 
WinDBG 디버거는 윈도우 DLL들에 대한 심볼을 자동으로 다운로드하도록 설정될 수 있다. 

마이크로소프트나 모질라는 또한 디버깅을 쉽게 하기 위해 소스 코드를 제공한다
(마이크로소프트의 경우는 닷넷 프레임워크 같은 특정한 요소만 제공한다).

애플은 애플 OS를 위한 "Symbolicate"(디버그 심볼 생성이라는 뜻)라는 용어를 사용한다.

 

 

 

 

Debugging with Symbols - Windows applications

This article provides a high level overview of how to best use symbols in your debugging process.

docs.microsoft.com

 

1. BTService를 부모로하는 BTService_Detect 클래스를 생성

  • 행동패턴은 플레이어를 발견했는지, 못했는지에 따라 추격과 정찰로 구분한다. 셀렉터로 확장한다.
  • 추격과 정찰 중 추격에 더 우선권을 주고, 추격로직은 Target을 행헤 이동하도록 설계한다
  • TickNode 함수에는 NPC의 위치를 기준으로 반경 6미터 내에 캐릭터가 있는지 감지하는 기능을 넣는다.
    반경 내에 모든 캐릭터를 감지하는 OverlapMultiByChannel 함수를 사용한다.
  • 감지된 모든 캐릭터 정보는 목록을 관리하는 데 적합한 TArry로 전달된다.

 

2. 오브젝트 채널 및 트레이스 채널 설정

 

 

캐릭터에서 Trace을 블록으로 해줘야, Trace로 콜리전 체크를 할떄, 판단을 할수가 있다.

 


Trace 콜리전 체크를 할떄 사용할 ECC_GameTraceChannel2

 

3.  코드

//h
UCLASS()
class KGAME_API UBTService_Detect : public UBTService
{
	GENERATED_BODY()
public:
	UBTService_Detect();

protected:
	virtual void TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds) override;
};

//cpp
#include "BTService_Detect.h"
#include "KAIController.h"
#include "KCharacter.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "DrawDebugHelpers.h"

UBTService_Detect::UBTService_Detect()
{
	NodeName = TEXT("K_Detect");
}


void UBTService_Detect::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{

	Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);

	APawn* ControllingPawn = OwnerComp.GetAIOwner()->GetPawn();  

	if (nullptr == ControllingPawn) return;

	UWorld* World = ControllingPawn->GetWorld();
	FVector Center = ControllingPawn->GetActorLocation();
	float DetectRadius = 600.0f;

	TArray<FOverlapResult> OverlapResults;
	FCollisionQueryParams CollisionQueryParam(NAME_None, false, ControllingPawn);

	bool bResult = World->OverlapMultiByChannel(
		OverlapResults,
		Center,
		FQuat::Identity,
		ECollisionChannel::ECC_GameTraceChannel2,
		FCollisionShape::MakeSphere(DetectRadius),
		CollisionQueryParam
	);

	if (bResult)
	{
		for (auto OverlapResult : OverlapResults)
		{
			AKCharacter* targetCharacter = Cast<AKCharacter>(OverlapResult.GetActor());
			if (targetCharacter && targetCharacter->GetController()->IsPlayerController())
			{
				OwnerComp.GetBlackboardComponent()->SetValueAsObject(AKAIController::TargetKey, targetCharacter);
				
				DrawDebugSphere(World, Center, DetectRadius, 16, FColor::Green, false, 0.2f);
				DrawDebugPoint(World, targetCharacter->GetActorLocation(), 10.0f, FColor::Blue, false, 0.2f);
				DrawDebugLine(World, ControllingPawn->GetActorLocation(), targetCharacter->GetActorLocation(), FColor::Blue, false, 0.27f);
				return;
			}
		}
	}
	else
	{
		OwnerComp.GetBlackboardComponent()->SetValueAsObject(AKAIController::TargetKey, nullptr);
	}
	//DrawDebugSphere(World, Center, DetectRadius, 16, FColor::Red, false, 0.2f);
}

 

 

4.  행동트리 수정

  • 이제 서비스가 실행된 결과에 따라 셀렉터 데코레이더 왼쪽의 추격과 셀렉터 데코레이터 오른쪽의 정찰 로직이 나눠지도록 행동트리 로직을 구성한다
  • 서비스 결과는 블랙보드의 Target 키에 값이 있는지, 없는지로 구분할 수 있다.
  • 데코레이터 노드를 사용한다.
  • 해당 키값의 변경이 감지되면 현재 컴포짓 노드의 실행을 곧바로 취소하고 노티파이 옵저버 값알
    OnValue Change로 변경한다.

 



 

 

'Unreal > Game 2 ' 카테고리의 다른 글

10.3 AI 공격  (0) 2019.07.05
10.1 AI 정찰  (0) 2019.07.02
10. AI 만들기  (0) 2019.07.01
9.3 PlayerState - 작성 중  (0) 2019.06.30
9.2 플레이어 HUD  (0) 2019.06.30

+ Recent posts